dmenu/patch/json.c
2021-05-15 14:40:05 +02:00

80 lines
1.7 KiB
C

#include <jansson.h>
static size_t items_sz = 0;
static size_t items_ln = 0;
static json_t *json = NULL;
static struct item *
itemnew(void)
{
if (items_ln + 1 >= (items_sz / sizeof *items))
if (!(items = realloc(items, (items_sz += BUFSIZ))))
die("cannot realloc %u bytes:", items_sz);
return &items[items_ln++];
}
static void
readjson(const char *path)
{
json_error_t jerr;
if (!(json = json_load_file(path, 0, &jerr)))
die("%s @ line: %i - %s", jerr.text, jerr.line, path);
}
static void
listjson(json_t *obj)
{
void *iter;
unsigned imax = 0;
unsigned tmpmax = 0;
struct item *item;
items_ln = 0;
iter = json_object_iter(obj);
while (iter) {
item = itemnew();
item->text = (char*) json_object_iter_key(iter);
item->json = json_object_iter_value(iter);
#if !MULTI_SELECTION_PATCH
item->out = 0;
#endif // MULTI_SELECTION_PATCH
drw_font_getexts(drw->fonts, item->text, strlen(item->text),
&tmpmax, NULL);
if (tmpmax > inputw) {
inputw = tmpmax;
imax = items_ln - 1;
}
iter = json_object_iter_next(obj, iter);
}
if (items)
items[items_ln].text = NULL;
inputw = items ? TEXTW(items[imax].text) : 0;
lines = MIN(lines, items_ln - 1);
}
static int
printjsonssel(unsigned int state)
{
if (sel && sel->json) {
if (json_is_object(sel->json)) {
listjson(sel->json);
text[0] = '\0';
match();
drawmenu();
return 0;
} else {
puts(json_string_value(sel->json));
}
} else {
#if PRINTINDEX_PATCH
if (print_index)
printf("%d\n", (sel && !(state & ShiftMask)) ? sel->index : -1);
else
puts((sel && !(state & ShiftMask)) ? sel->text : text);
#else
puts((sel && !(state & ShiftMask)) ? sel->text : text);
#endif // PRINTINDEX_PATCH
}
return 1;
}