2 * vim:ts=4:sw=4:expandtab
4 * i3bar - an xcb-based status- and ws-bar for i3
5 * © 2010-2012 Axel Wagner and contributors (see also: LICENSE)
7 * mode.c: Handle mode-event and show current binding mode in the bar
14 #include <yajl/yajl_parse.h>
15 #include <yajl/yajl_version.h>
19 /* A datatype to pass through the callbacks to save the state */
20 struct mode_json_params {
27 * Parse a string (change)
31 static int mode_string_cb(void *params_, const unsigned char *val, size_t len) {
33 static int mode_string_cb(void *params_, const unsigned char *val, unsigned int len) {
35 struct mode_json_params *params = (struct mode_json_params*) params_;
37 if (!strcmp(params->cur_key, "change")) {
40 params->mode->name = i3string_from_utf8_with_length((const char *)val, len);
41 /* Save its rendered width */
42 params->mode->width = predict_text_width(params->mode->name);
44 DLOG("Got mode change: %s\n", i3string_as_utf8(params->mode->name));
45 FREE(params->cur_key);
56 * Essentially we just save it in the parsing-state
60 static int mode_map_key_cb(void *params_, const unsigned char *keyVal, size_t keyLen) {
62 static int mode_map_key_cb(void *params_, const unsigned char *keyVal, unsigned int keyLen) {
64 struct mode_json_params *params = (struct mode_json_params*) params_;
65 FREE(params->cur_key);
67 params->cur_key = smalloc(sizeof(unsigned char) * (keyLen + 1));
68 strncpy(params->cur_key, (const char*) keyVal, keyLen);
69 params->cur_key[keyLen] = '\0';
74 /* A datastructure to pass all these callbacks to yajl */
75 yajl_callbacks mode_callbacks = {
90 * Start parsing the received json-string
93 void parse_mode_json(char *json) {
94 /* FIXME: Fasciliate stream-processing, i.e. allow starting to interpret
96 struct mode_json_params params;
100 params.cur_key = NULL;
102 params.mode = &binding;
108 yajl_parser_config parse_conf = { 0, 0 };
110 handle = yajl_alloc(&mode_callbacks, &parse_conf, NULL, (void*) ¶ms);
112 handle = yajl_alloc(&mode_callbacks, NULL, (void*) ¶ms);
115 state = yajl_parse(handle, (const unsigned char*) json, strlen(json));
117 /* FIXME: Propper errorhandling for JSON-parsing */
121 case yajl_status_client_canceled:
123 case yajl_status_insufficient_data:
125 case yajl_status_error:
126 ELOG("Could not parse mode-event!\n");
131 /* We don't want to indicate default binding mode */
132 if (strcmp("default", i3string_as_utf8(params.mode->name)) == 0)
133 I3STRING_FREE(params.mode->name);
135 /* Set the new binding mode */
136 set_current_mode(&binding);
140 FREE(params.cur_key);