diff options
author | Ian Fan <[email protected]> | 2018-09-12 08:28:28 +0100 |
---|---|---|
committer | Ian Fan <[email protected]> | 2018-09-12 08:28:28 +0100 |
commit | 2eaef802061836dd83bbf753174fcb8488b2d8cd (patch) | |
tree | 33fcd285cc70a6cea257b1f3b6d24121d340a270 /swaybar/i3bar.c | |
parent | af9e8f94cc0afb9f80e3902cbb83de78027cd737 (diff) |
i3bar: count references to blocks
This prevents blocks from being destroyed before their hotspots are destroyed,
in case it is used for a pending click event that fires between the bar
receiving a new status, which destroys the block, and the bar rendering the new
status, which destroys the hotspot; this problem can be easily produced by
scrolling on a block that immediately causes a new status to be sent, with
multiple outputs
Diffstat (limited to 'swaybar/i3bar.c')
-rw-r--r-- | swaybar/i3bar.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/swaybar/i3bar.c b/swaybar/i3bar.c index ae37eeb9..1345ee9b 100644 --- a/swaybar/i3bar.c +++ b/swaybar/i3bar.c @@ -8,11 +8,10 @@ #include "swaybar/config.h" #include "swaybar/status_line.h" -void i3bar_block_free(struct i3bar_block *block) { +static void i3bar_block_free(struct i3bar_block *block) { if (!block) { return; } - wl_list_remove(&block->link); free(block->full_text); free(block->short_text); free(block->align); @@ -22,10 +21,17 @@ void i3bar_block_free(struct i3bar_block *block) { free(block); } +void i3bar_block_unref(struct i3bar_block *block) { + if (--block->ref_count == 0) { + i3bar_block_free(block); + } +} + static bool i3bar_parse_json(struct status_line *status, const char *text) { struct i3bar_block *block, *tmp; wl_list_for_each_safe(block, tmp, &status->blocks, link) { - i3bar_block_free(block); + wl_list_remove(&block->link); + i3bar_block_unref(block); } json_object *results = json_tokener_parse(text); if (!results) { @@ -61,6 +67,7 @@ static bool i3bar_parse_json(struct status_line *status, const char *text) { json_object_object_get_ex(json, "border_right", &border_right); struct i3bar_block *block = calloc(1, sizeof(struct i3bar_block)); + block->ref_count = 1; block->full_text = full_text ? strdup(json_object_get_string(full_text)) : NULL; block->short_text = short_text ? |