mirror of
https://github.com/swaywm/sway.git
synced 2026-02-18 22:05:45 -05:00
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
This commit is contained in:
parent
af9e8f94cc
commit
2eaef80206
4 changed files with 19 additions and 6 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue