git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commitf0ac1d2c86d7c29828028ac27bf12943a8e43f89
parente6af44a495
authorLucas Galante <[email protected]>
date2026-07-22 08:35
fix: don't double-subtract xdg geometry from the surface tree

wlr_scene_xdg_surface_create already anchors its subtree at the top-left
of the xdg window geometry (re-offset on every commit), so shifting
surfaces.tree by -geometry.x/y on top compensated twice and pushed CSD
windows with shadow margins (floating Electron/Chromium — e.g. Claude
Desktop) up-left off their desktop-grid cell by the shadow size. cce apps
report zero geometry offset and maximized Chromium drops its shadows,
which is why only floating Electron windows showed it.

Co-Authored-By: Claude Fable 5 <[email protected]>

 src/server/window.rs | 24 ++++++------------------
 1 file changed, 6 insertions(+), 18 deletions(-)

diff --git a/src/server/window.rs b/src/server/window.rs
index 834b0db..8268f2e 100644
--- a/src/server/window.rs
+++ b/src/server/window.rs
@@ -2081,24 +2081,12 @@ impl Window {
         ffi::river_scene_node_set_position_if_changed(self.tree as *mut ffi::wlr_scene_node, self.box_geom.x, self.box_geom.y);
         ffi::river_scene_node_set_position_if_changed(self.popup_tree as *mut ffi::wlr_scene_node, self.box_geom.x, self.box_geom.y);
 
-        let (geom_x, geom_y) = match self.impl_type {
-            WindowImpl::Toplevel(toplevel) => {
-                if toplevel.is_null() {
-                    (0, 0)
-                } else {
-                    let mut x = (*toplevel).geometry.x;
-                    let mut y = (*toplevel).geometry.y;
-                    if self.wm_requested.ssd {
-                        x = 0;
-                        y = 0;
-                    }
-
-                    (x, y)
-                }
-            }
-            _ => (0, 0),
-        };
-        ffi::river_scene_node_set_position_if_changed(self.surfaces.tree as *mut ffi::wlr_scene_node, -geom_x, -geom_y);
+        // No geometry compensation here: wlr_scene_xdg_surface_create already
+        // anchors its subtree at the top-left of the xdg window geometry (it
+        // re-offsets by -geometry on every commit), so subtracting geometry.x/y
+        // again shifted CSD windows with shadow margins (Electron/Chromium
+        // floating) up-left by their shadow size, off the desktop grid.
+        ffi::river_scene_node_set_position_if_changed(self.surfaces.tree as *mut ffi::wlr_scene_node, 0, 0);
 
         self.apply_surface_clip(&clip, &content_clip);