From 2eaef802061836dd83bbf753174fcb8488b2d8cd Mon Sep 17 00:00:00 2001 From: Ian Fan Date: Wed, 12 Sep 2018 08:28:28 +0100 Subject: 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 --- swaybar/render.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'swaybar/render.c') diff --git a/swaybar/render.c b/swaybar/render.c index 7303e70f..2d848bfa 100644 --- a/swaybar/render.c +++ b/swaybar/render.c @@ -115,6 +115,10 @@ static enum hotspot_event_handling block_hotspot_callback(struct swaybar_output return i3bar_block_send_click(status, block, x, y, button); } +static void i3bar_block_unref_callback(void *data) { + i3bar_block_unref(data); +} + static uint32_t render_status_block(cairo_t *cairo, struct swaybar_config *config, struct swaybar_output *output, struct i3bar_block *block, double *x, @@ -179,8 +183,9 @@ static uint32_t render_status_block(cairo_t *cairo, hotspot->width = width; hotspot->height = height; hotspot->callback = block_hotspot_callback; - hotspot->destroy = NULL; + hotspot->destroy = i3bar_block_unref_callback; hotspot->data = block; + block->ref_count++; wl_list_insert(&output->hotspots, &hotspot->link); double pos = *x; -- cgit v1.2.3-70-g09d2