X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=i3bar%2Fsrc%2Foutputs.c;h=b49ff53f6892bbb7ee69fb409c0b755d4dfbeb75;hb=96e1b80371b985d4f67b36e6cb48e61b5fb83995;hp=464f24a0ea52fa171b5caa1904d6d4708672cd89;hpb=717ae819c55d2aca9f4bf2e1198e035ca64114ac;p=i3%2Fi3 diff --git a/i3bar/src/outputs.c b/i3bar/src/outputs.c index 464f24a0..b49ff53f 100644 --- a/i3bar/src/outputs.c +++ b/i3bar/src/outputs.c @@ -1,11 +1,10 @@ /* - * i3bar - an xcb-based status- and ws-bar for i3 - * - * © 2010-2011 Axel Wagner and contributors + * vim:ts=4:sw=4:expandtab * - * See file LICNSE for license information + * i3bar - an xcb-based status- and ws-bar for i3 + * © 2010 Axel Wagner and contributors (see also: LICENSE) * - * src/outputs.c: Maintaining the output-list + * outputs.c: Maintaining the outputs list * */ #include @@ -21,18 +20,18 @@ /* A datatype to pass through the callbacks to save the state */ struct outputs_json_params { struct outputs_head *outputs; - i3_output *outputs_walk; - char *cur_key; - char *json; - bool init; + i3_output *outputs_walk; + char *cur_key; + char *json; + bool in_rect; }; /* - * Parse a null-value (current_workspace) + * Parse a null value (current_workspace) * */ static int outputs_null_cb(void *params_) { - struct outputs_json_params *params = (struct outputs_json_params*) params_; + struct outputs_json_params *params = (struct outputs_json_params *)params_; FREE(params->cur_key); @@ -44,56 +43,56 @@ static int outputs_null_cb(void *params_) { * */ static int outputs_boolean_cb(void *params_, int val) { - struct outputs_json_params *params = (struct outputs_json_params*) params_; + struct outputs_json_params *params = (struct outputs_json_params *)params_; - if (strcmp(params->cur_key, "active")) { - return 0; + if (!strcmp(params->cur_key, "active")) { + params->outputs_walk->active = val; + FREE(params->cur_key); + return 1; } - params->outputs_walk->active = val; - - FREE(params->cur_key); + if (!strcmp(params->cur_key, "primary")) { + params->outputs_walk->primary = val; + FREE(params->cur_key); + return 1; + } - return 1; + return 0; } /* * Parse an integer (current_workspace or the rect) * */ -#if YAJL_MAJOR >= 2 static int outputs_integer_cb(void *params_, long long val) { -#else -static int outputs_integer_cb(void *params_, long val) { -#endif - struct outputs_json_params *params = (struct outputs_json_params*) params_; + struct outputs_json_params *params = (struct outputs_json_params *)params_; if (!strcmp(params->cur_key, "current_workspace")) { - params->outputs_walk->ws = (int) val; + params->outputs_walk->ws = (int)val; FREE(params->cur_key); return 1; } if (!strcmp(params->cur_key, "x")) { - params->outputs_walk->rect.x = (int) val; + params->outputs_walk->rect.x = (int)val; FREE(params->cur_key); return 1; } if (!strcmp(params->cur_key, "y")) { - params->outputs_walk->rect.y = (int) val; + params->outputs_walk->rect.y = (int)val; FREE(params->cur_key); return 1; } if (!strcmp(params->cur_key, "width")) { - params->outputs_walk->rect.w = (int) val; + params->outputs_walk->rect.w = (int)val; FREE(params->cur_key); return 1; } if (!strcmp(params->cur_key, "height")) { - params->outputs_walk->rect.h = (int) val; + params->outputs_walk->rect.h = (int)val; FREE(params->cur_key); return 1; } @@ -105,16 +104,12 @@ static int outputs_integer_cb(void *params_, long val) { * Parse a string (name) * */ -#if YAJL_MAJOR >= 2 static int outputs_string_cb(void *params_, const unsigned char *val, size_t len) { -#else -static int outputs_string_cb(void *params_, const unsigned char *val, unsigned int len) { -#endif - struct outputs_json_params *params = (struct outputs_json_params*) params_; + struct outputs_json_params *params = (struct outputs_json_params *)params_; if (!strcmp(params->cur_key, "current_workspace")) { - char *copy = malloc(sizeof(const unsigned char) * (len + 1)); - strncpy(copy, (const char*) val, len); + char *copy = smalloc(sizeof(const unsigned char) * (len + 1)); + strncpy(copy, (const char *)val, len); copy[len] = '\0'; char *end; @@ -132,8 +127,8 @@ static int outputs_string_cb(void *params_, const unsigned char *val, unsigned i return 0; } - char *name = malloc(sizeof(const unsigned char) * (len + 1)); - strncpy(name, (const char*) val, len); + char *name = smalloc(sizeof(const unsigned char) * (len + 1)); + strncpy(name, (const char *)val, len); name[len] = '\0'; params->outputs_walk->name = name; @@ -144,24 +139,24 @@ static int outputs_string_cb(void *params_, const unsigned char *val, unsigned i } /* - * We hit the start of a json-map (rect or a new output) + * We hit the start of a JSON map (rect or a new output) * */ static int outputs_start_map_cb(void *params_) { - struct outputs_json_params *params = (struct outputs_json_params*) params_; + struct outputs_json_params *params = (struct outputs_json_params *)params_; i3_output *new_output = NULL; if (params->cur_key == NULL) { - new_output = malloc(sizeof(i3_output)); + new_output = smalloc(sizeof(i3_output)); new_output->name = NULL; new_output->ws = 0, memset(&new_output->rect, 0, sizeof(rect)); new_output->bar = XCB_NONE; - new_output->workspaces = malloc(sizeof(struct ws_head)); + new_output->workspaces = smalloc(sizeof(struct ws_head)); TAILQ_INIT(new_output->workspaces); - new_output->trayclients = malloc(sizeof(struct tc_head)); + new_output->trayclients = smalloc(sizeof(struct tc_head)); TAILQ_INIT(new_output->trayclients); params->outputs_walk = new_output; @@ -169,6 +164,10 @@ static int outputs_start_map_cb(void *params_) { return 1; } + if (!strcmp(params->cur_key, "rect")) { + params->in_rect = true; + } + return 1; } @@ -177,8 +176,34 @@ static int outputs_start_map_cb(void *params_) { * */ static int outputs_end_map_cb(void *params_) { - struct outputs_json_params *params = (struct outputs_json_params*) params_; - /* FIXME: What is at the end of a rect? */ + struct outputs_json_params *params = (struct outputs_json_params *)params_; + if (params->in_rect) { + params->in_rect = false; + /* Ignore the end of a rect */ + return 1; + } + + /* See if we actually handle that output */ + if (config.num_outputs > 0) { + bool handle_output = false; + for (int c = 0; c < config.num_outputs; c++) { + if (strcasecmp(params->outputs_walk->name, config.outputs[c]) != 0) + continue; + + handle_output = true; + break; + } + if (!handle_output) { + DLOG("Ignoring output \"%s\", not configured to handle it.\n", + params->outputs_walk->name); + FREE(params->outputs_walk->name); + FREE(params->outputs_walk->workspaces); + FREE(params->outputs_walk->trayclients); + FREE(params->outputs_walk); + FREE(params->cur_key); + return 1; + } + } i3_output *target = get_output_by_name(params->outputs_walk->name); @@ -186,6 +211,7 @@ static int outputs_end_map_cb(void *params_) { SLIST_INSERT_HEAD(outputs, params->outputs_walk, slist); } else { target->active = params->outputs_walk->active; + target->primary = params->outputs_walk->primary; target->ws = params->outputs_walk->ws; target->rect = params->outputs_walk->rect; } @@ -195,50 +221,42 @@ static int outputs_end_map_cb(void *params_) { /* * Parse a key. * - * Essentially we just save it in the parsing-state + * Essentially we just save it in the parsing state * */ -#if YAJL_MAJOR >= 2 static int outputs_map_key_cb(void *params_, const unsigned char *keyVal, size_t keyLen) { -#else -static int outputs_map_key_cb(void *params_, const unsigned char *keyVal, unsigned keyLen) { -#endif - struct outputs_json_params *params = (struct outputs_json_params*) params_; + struct outputs_json_params *params = (struct outputs_json_params *)params_; FREE(params->cur_key); - params->cur_key = malloc(sizeof(unsigned char) * (keyLen + 1)); - strncpy(params->cur_key, (const char*) keyVal, keyLen); + params->cur_key = smalloc(sizeof(unsigned char) * (keyLen + 1)); + strncpy(params->cur_key, (const char *)keyVal, keyLen); params->cur_key[keyLen] = '\0'; return 1; } /* A datastructure to pass all these callbacks to yajl */ -yajl_callbacks outputs_callbacks = { - &outputs_null_cb, - &outputs_boolean_cb, - &outputs_integer_cb, - NULL, - NULL, - &outputs_string_cb, - &outputs_start_map_cb, - &outputs_map_key_cb, - &outputs_end_map_cb, - NULL, - NULL +static yajl_callbacks outputs_callbacks = { + .yajl_null = outputs_null_cb, + .yajl_boolean = outputs_boolean_cb, + .yajl_integer = outputs_integer_cb, + .yajl_string = outputs_string_cb, + .yajl_start_map = outputs_start_map_cb, + .yajl_map_key = outputs_map_key_cb, + .yajl_end_map = outputs_end_map_cb, }; /* - * Initiate the output-list + * Initiate the outputs list * */ -void init_outputs() { - outputs = malloc(sizeof(struct outputs_head)); +void init_outputs(void) { + outputs = smalloc(sizeof(struct outputs_head)); SLIST_INIT(outputs); } /* - * Start parsing the received json-string + * Start parsing the received JSON string * */ void parse_outputs_json(char *json) { @@ -247,29 +265,21 @@ void parse_outputs_json(char *json) { params.outputs_walk = NULL; params.cur_key = NULL; params.json = json; + params.in_rect = false; yajl_handle handle; yajl_status state; -#if YAJL_MAJOR < 2 - yajl_parser_config parse_conf = { 0, 0 }; - - handle = yajl_alloc(&outputs_callbacks, &parse_conf, NULL, (void*) ¶ms); -#else - handle = yajl_alloc(&outputs_callbacks, NULL, (void*) ¶ms); -#endif + handle = yajl_alloc(&outputs_callbacks, NULL, (void *)¶ms); - state = yajl_parse(handle, (const unsigned char*) json, strlen(json)); + state = yajl_parse(handle, (const unsigned char *)json, strlen(json)); /* FIXME: Propper errorhandling for JSON-parsing */ switch (state) { case yajl_status_ok: break; case yajl_status_client_canceled: -#if YAJL_MAJOR < 2 - case yajl_status_insufficient_data: -#endif case yajl_status_error: - ELOG("Could not parse outputs-reply!\n"); + ELOG("Could not parse outputs reply!\n"); exit(EXIT_FAILURE); break; }