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);
|
wlr_scene_node_set_position(&tb_fb->scene_buf->node, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If titlebar buffer is too narrow, draw into parent frame instead
|
/* Resize titlebar buffer if too narrow — detach from scene graph
|
||||||
* to avoid replacing the pixman image while the scene graph may still
|
* first so the old pixel data isn't accessed after being freed. */
|
||||||
* hold a reference to the old wlr_buffer data. */
|
|
||||||
if (tb_fb && tb_fb->width < tb_w) {
|
if (tb_fb && tb_fb->width < tb_w) {
|
||||||
tb_img = fb->image;
|
if (tb_fb->scene_buf)
|
||||||
tb_fb = NULL;
|
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];
|
WTexture *tex = fwin->title_texture[state];
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue