fix titlebar resize: detach buffer from scene before replacing
Call wlr_scene_buffer_set_buffer(NULL) before freeing the old pixman image so the scene graph cannot access freed data. Re-register the backing table entry after creating the new image.
This commit is contained in:
parent
c2c3bca41b
commit
dd1302a711
|
|
@ -578,12 +578,22 @@ wl_frame_paint(struct WFrameWindow *fwin)
|
|||
wlr_scene_node_set_position(&tb_fb->scene_buf->node, 0, 0);
|
||||
}
|
||||
|
||||
/* If titlebar buffer is too narrow, draw into parent frame instead
|
||||
* to avoid replacing the pixman image while the scene graph may still
|
||||
* hold a reference to the old wlr_buffer data. */
|
||||
/* Resize titlebar buffer if too narrow — detach from scene graph
|
||||
* first so the old pixel data isn't accessed after being freed. */
|
||||
if (tb_fb && tb_fb->width < tb_w) {
|
||||
tb_img = fb->image;
|
||||
tb_fb = NULL;
|
||||
if (tb_fb->scene_buf)
|
||||
wlr_scene_buffer_set_buffer(tb_fb->scene_buf, NULL);
|
||||
pixman_image_unref(tb_fb->image);
|
||||
tb_fb->image = pixman_image_create_bits(PIXMAN_a8r8g8b8,
|
||||
tb_w, tb_h, NULL, 0);
|
||||
tb_fb->width = tb_w;
|
||||
tb_fb->height = tb_h;
|
||||
tb_fb->base.width = tb_w;
|
||||
tb_fb->base.height = tb_h;
|
||||
tb_img = tb_fb->image;
|
||||
W_RegisterBacking(tb_fb->id, tb_fb->image);
|
||||
if (tb_fb->scene_buf)
|
||||
wlr_scene_buffer_set_dest_size(tb_fb->scene_buf, tb_w, tb_h);
|
||||
}
|
||||
WTexture *tex = fwin->title_texture[state];
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue