X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=i3bar%2Fsrc%2Foutputs.c;h=841a7565c6e8257d2d79fe53b5e9d23ba57aeea2;hb=dc05d905c1ab0978ca98b3e15ff96d18df55c182;hp=db9867025d86f097e02a06a5c4a14be959b0d8c6;hpb=794783defbb7073f5ca4676e9b088308baac5540;p=i3%2Fi3 diff --git a/i3bar/src/outputs.c b/i3bar/src/outputs.c index db986702..841a7565 100644 --- a/i3bar/src/outputs.c +++ b/i3bar/src/outputs.c @@ -2,9 +2,9 @@ * 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) * - * outputs.c: Maintaining the output-list + * outputs.c: Maintaining the outputs list * */ #include @@ -20,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 in_rect; + 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); @@ -43,7 +43,7 @@ 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")) { params->outputs_walk->active = val; @@ -64,39 +64,35 @@ static int outputs_boolean_cb(void *params_, int val) { * 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; } @@ -108,17 +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 = smalloc(sizeof(const unsigned char) * (len + 1)); - strncpy(copy, (const char*) val, len); - copy[len] = '\0'; + char *copy = NULL; + sasprintf(©, "%.*s", len, val); char *end; errno = 0; @@ -126,7 +117,8 @@ static int outputs_string_cb(void *params_, const unsigned char *val, unsigned i if (errno == 0 && (end && *end == '\0')) params->outputs_walk->ws = parsed_num; - free(copy); + + FREE(copy); FREE(params->cur_key); return 1; } @@ -135,31 +127,33 @@ static int outputs_string_cb(void *params_, const unsigned char *val, unsigned i return 0; } - char *name = smalloc(sizeof(const unsigned char) * (len + 1)); - strncpy(name, (const char*) val, len); - name[len] = '\0'; - - params->outputs_walk->name = name; + sasprintf(&(params->outputs_walk->name), "%.*s", len, val); FREE(params->cur_key); - return 1; } /* - * 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 = smalloc(sizeof(i3_output)); new_output->name = NULL; + new_output->active = false; + new_output->primary = false; + new_output->visible = false; new_output->ws = 0, + new_output->statusline_width = 0; + new_output->statusline_short_text = false; memset(&new_output->rect, 0, sizeof(rect)); - new_output->bar = XCB_NONE; + memset(&new_output->bar, 0, sizeof(surface_t)); + memset(&new_output->buffer, 0, sizeof(surface_t)); + memset(&new_output->statusline_buffer, 0, sizeof(surface_t)); new_output->workspaces = smalloc(sizeof(struct ws_head)); TAILQ_INIT(new_output->workspaces); @@ -184,7 +178,7 @@ 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_; + struct outputs_json_params *params = (struct outputs_json_params *)params_; if (params->in_rect) { params->in_rect = false; /* Ignore the end of a rect */ @@ -229,41 +223,29 @@ 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 = smalloc(sizeof(unsigned char) * (keyLen + 1)); - strncpy(params->cur_key, (const char*) keyVal, keyLen); - params->cur_key[keyLen] = '\0'; - + sasprintf(&(params->cur_key), "%.*s", keyLen, keyVal); 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(void) { @@ -272,7 +254,7 @@ void init_outputs(void) { } /* - * Start parsing the received json-string + * Start parsing the received JSON string * */ void parse_outputs_json(char *json) { @@ -285,26 +267,17 @@ void parse_outputs_json(char *json) { 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; } @@ -329,3 +302,17 @@ i3_output *get_output_by_name(char *name) { return walk; } + +/* + * Returns true if the output has the currently focused workspace + * + */ +bool output_has_focus(i3_output *output) { + i3_ws *ws_walk; + TAILQ_FOREACH(ws_walk, output->workspaces, tailq) { + if (ws_walk->focused) { + return true; + } + } + return false; +}