diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index 0e97e46..bc5c870 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -7092,6 +7092,33 @@ wl_screen_create_internals(WScreen *scr) scr->info_window = (WNativeWindow)xwin; } + /* Create dock_shadow: scene_buffer used as ghost overlay during icon drag */ + if (wl_state.scene) { + int sz = wPreferences.icon_size; + struct wl_frame_buf *dsfb = wmalloc(sizeof(*dsfb)); + memset(dsfb, 0, sizeof(*dsfb)); + dsfb->image = pixman_image_create_bits(PIXMAN_a8r8g8b8, sz, sz, NULL, sz * 4); + if (dsfb->image) { + wlr_buffer_init(&dsfb->base, &frame_buf_impl, sz, sz); + dsfb->id = wl_state.next_synthetic_id++; + dsfb->width = sz; + dsfb->height = sz; + struct wlr_scene_tree *ds_parent = wl_state.level_trees[WL_LAYER_OVERLAY] + ? wl_state.level_trees[WL_LAYER_OVERLAY] : &wl_state.scene->tree; + dsfb->tree = wlr_scene_tree_create(ds_parent); + if (dsfb->tree) { + dsfb->scene_buf = wlr_scene_buffer_create(dsfb->tree, &dsfb->base); + if (dsfb->scene_buf) + wlr_scene_node_set_enabled(&dsfb->scene_buf->node, false); + wlr_scene_node_set_enabled(&dsfb->tree->node, false); + } + wl_list_insert(&wl_state.frame_list, &dsfb->link); + scr->dock_shadow = dsfb->id; + } else { + wfree(dsfb); + } + } + /* Phase 30: dock/clip now uses XWayland windows for rendering. * The WM's dock logic (dock.c) creates X11 windows on the XWayland * Display* and draws on them with Xlib — the compositor composites