From bb95bd52cd5b5ee4b7293155c16738ed634f7676 Mon Sep 17 00:00:00 2001 From: lkn Date: Sun, 21 Jun 2026 19:18:20 +0200 Subject: [PATCH] wayland: apply CSD geometry offset in wl_window_move MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without this, moving a CSD client (Firefox) causes the surface to "pop" out of the WM frame — the scene node was positioned at the raw frame-relative coords without subtracting geometry.x/y. --- src/backend/wayland/wl_window.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/backend/wayland/wl_window.c b/src/backend/wayland/wl_window.c index 21eac08..a8b7c69 100644 --- a/src/backend/wayland/wl_window.c +++ b/src/backend/wayland/wl_window.c @@ -189,11 +189,16 @@ void wl_window_move(WNativeWindow win, int x, int y) v->x = x; v->y = y; } if (v->scene_node) { - /* Scene node is a child of the frame tree — use relative coords */ + /* Scene node position must account for CSD geometry offset */ + int gx = 0, gy = 0; + if (v->xdg_surface) { + gx = v->xdg_surface->geometry.x; + gy = v->xdg_surface->geometry.y; + } if (v->frame_id) - wlr_scene_node_set_position(&v->scene_node->node, x, y); + wlr_scene_node_set_position(&v->scene_node->node, x - gx, y - gy); else - wlr_scene_node_set_position(&v->scene_node->node, v->x, v->y); + wlr_scene_node_set_position(&v->scene_node->node, v->x - gx, v->y - gy); } if (v->xw_surface) wlr_xwayland_surface_configure(v->xw_surface,