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:
lkn 2026-06-23 20:35:31 +02:00
parent c2c3bca41b
commit dd1302a711
1 changed files with 15 additions and 5 deletions

View File

@ -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];