aboutsummaryrefslogtreecommitdiffstats
path: root/swaybar/ipc.c
diff options
context:
space:
mode:
Diffstat (limited to 'swaybar/ipc.c')
-rw-r--r--swaybar/ipc.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/swaybar/ipc.c b/swaybar/ipc.c
index 6bbe9408..9d81a9fb 100644
--- a/swaybar/ipc.c
+++ b/swaybar/ipc.c
@@ -147,8 +147,10 @@ static bool ipc_parse_config(
147 147
148 json_object *font = json_object_object_get(bar_config, "font"); 148 json_object *font = json_object_object_get(bar_config, "font");
149 if (font) { 149 if (font) {
150 free(config->font); 150 pango_font_description_free(config->font_description);
151 config->font = parse_font(json_object_get_string(font)); 151 char *font_value = parse_font(json_object_get_string(font));
152 config->font_description = pango_font_description_from_string(font_value);
153 free(font_value);
152 } 154 }
153 155
154 json_object *gaps = json_object_object_get(bar_config, "gaps"); 156 json_object *gaps = json_object_object_get(bar_config, "gaps");
@@ -485,8 +487,7 @@ static bool handle_barconfig_update(struct swaybar *bar, const char *payload,
485 destroy_layer_surface(output); 487 destroy_layer_surface(output);
486 wl_list_remove(&output->link); 488 wl_list_remove(&output->link);
487 wl_list_insert(&bar->unused_outputs, &output->link); 489 wl_list_insert(&bar->unused_outputs, &output->link);
488 } else if (!oldcfg->font || !newcfg->font || 490 } else if (!pango_font_description_equal(oldcfg->font_description, newcfg->font_description)) {
489 strcmp(oldcfg->font, newcfg->font) != 0) {
490 output->height = 0; // force update height 491 output->height = 0; // force update height
491 } 492 }
492 } 493 }
@@ -547,9 +548,23 @@ bool handle_ipc_readable(struct swaybar *bar) {
547 return false; 548 return false;
548 } 549 }
549 550
550 json_object *result = json_tokener_parse(resp->payload); 551 // The default depth of 32 is too small to represent some nested layouts, but
551 if (!result) { 552 // we can't pass INT_MAX here because json-c (as of this writing) prefaults
552 sway_log(SWAY_ERROR, "failed to parse payload as json"); 553 // all the memory for its stack.
554 json_tokener *tok = json_tokener_new_ex(JSON_MAX_DEPTH);
555 if (!tok) {
556 sway_log_errno(SWAY_ERROR, "failed to create tokener");
557 free_ipc_response(resp);
558 return false;
559 }
560
561 json_object *result = json_tokener_parse_ex(tok, resp->payload, -1);
562 enum json_tokener_error err = json_tokener_get_error(tok);
563 json_tokener_free(tok);
564
565 if (err != json_tokener_success) {
566 sway_log(SWAY_ERROR, "failed to parse payload as json: %s",
567 json_tokener_error_desc(err));
553 free_ipc_response(resp); 568 free_ipc_response(resp);
554 return false; 569 return false;
555 } 570 }