X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=i3bar%2Fsrc%2Fparse_json_header.c;h=1cd951065c8e379f123d08671b12c769e8468e8f;hb=884214f14fdbd0a4a368d2a36d5e50324fa1d52a;hp=80ec5af8f78d4de61bda169e442b5552ac57631e;hpb=71ccb4bef2850bd5beab8a4ef4669bf53b5a9781;p=i3%2Fi3 diff --git a/i3bar/src/parse_json_header.c b/i3bar/src/parse_json_header.c index 80ec5af8..1cd95106 100644 --- a/i3bar/src/parse_json_header.c +++ b/i3bar/src/parse_json_header.c @@ -2,7 +2,7 @@ * vim:ts=4:sw=4:expandtab * * i3bar - an xcb-based status- and ws-bar for i3 - * © 2010-2012 Axel Wagner and contributors (see also: LICENSE) + * © 2010 Axel Wagner and contributors (see also: LICENSE) * * parse_json_header.c: Parse the JSON protocol header to determine * protocol version and features. @@ -31,14 +31,11 @@ static enum { KEY_VERSION, KEY_STOP_SIGNAL, KEY_CONT_SIGNAL, + KEY_CLICK_EVENTS, NO_KEY } current_key; -#if YAJL_MAJOR >= 2 static int header_integer(void *ctx, long long val) { -#else -static int header_integer(void *ctx, long val) { -#endif i3bar_child *child = ctx; switch (current_key) { @@ -54,41 +51,40 @@ static int header_integer(void *ctx, long val) { default: break; } + + return 1; +} + +static int header_boolean(void *ctx, int val) { + i3bar_child *child = ctx; + + switch (current_key) { + case KEY_CLICK_EVENTS: + child->click_events = val; + break; + default: + break; + } + return 1; } #define CHECK_KEY(name) (stringlen == strlen(name) && \ - STARTS_WITH((const char*)stringval, stringlen, name)) + STARTS_WITH((const char *)stringval, stringlen, name)) -#if YAJL_MAJOR >= 2 static int header_map_key(void *ctx, const unsigned char *stringval, size_t stringlen) { -#else -static int header_map_key(void *ctx, const unsigned char *stringval, unsigned int stringlen) { -#endif if (CHECK_KEY("version")) { current_key = KEY_VERSION; } else if (CHECK_KEY("stop_signal")) { current_key = KEY_STOP_SIGNAL; } else if (CHECK_KEY("cont_signal")) { current_key = KEY_CONT_SIGNAL; + } else if (CHECK_KEY("click_events")) { + current_key = KEY_CLICK_EVENTS; } return 1; } -static yajl_callbacks version_callbacks = { - NULL, /* null */ - NULL, /* boolean */ - &header_integer, - NULL, /* double */ - NULL, /* number */ - NULL, /* string */ - NULL, /* start_map */ - &header_map_key, - NULL, /* end_map */ - NULL, /* start_array */ - NULL /* end_array */ -}; - static void child_init(i3bar_child *child) { child->version = 0; child->stop_signal = SIGSTOP; @@ -104,20 +100,20 @@ static void child_init(i3bar_child *child) { * */ void parse_json_header(i3bar_child *child, const unsigned char *buffer, int length, unsigned int *consumed) { + static yajl_callbacks version_callbacks = { + .yajl_boolean = header_boolean, + .yajl_integer = header_integer, + .yajl_map_key = &header_map_key, + }; + child_init(child); current_key = NO_KEY; -#if YAJL_MAJOR >= 2 yajl_handle handle = yajl_alloc(&version_callbacks, NULL, child); /* Allow trailing garbage. yajl 1 always behaves that way anyways, but for * yajl 2, we need to be explicit. */ yajl_config(handle, yajl_allow_trailing_garbage, 1); -#else - yajl_parser_config parse_conf = { 0, 0 }; - - yajl_handle handle = yajl_alloc(&version_callbacks, &parse_conf, NULL, child); -#endif yajl_status state = yajl_parse(handle, buffer, length); if (state != yajl_status_ok) {