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

commit018d76ac460ba970e7a5821a7c24ed7fda4a0020
parentff09e840bb
authorLucas Galante <[email protected]>
date2026-08-18 10:18
grid: stack the grid client in layers.bottom, not by render-list order

The reorder pass had no arm for the grid window, so it fell into the
generic layers.wm arm and was raised in render-list order like a normal
window — whichever windows mapped before it were buried under the patch
buffer (the whole desktop except the last-mapped window, in a restored
session). The grid now parents to layers.bottom: above the native
backdrop and fallback cells in layers.background, under every window,
re-evaluated on every reorder pass.

Also drop the per-transaction render-list debug dump (info-level, ~130MB
of /tmp/cce.log in two hours); it was grid instrumentation and the rule
above is what it existed to find.

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

 src/server/window_manager.rs | 21 ++++++++-------------
 1 file changed, 8 insertions(+), 13 deletions(-)

diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index 9ba33e7..5bfa484 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -1670,19 +1670,6 @@ impl WindowManager {
         let new_order_hash = hasher.finish();
         let reorder = self.rendering_requested.order_hash != new_order_hash;
         self.rendering_requested.order_hash = new_order_hash;
-        log::info!("[render_finish_loop] START - render_list={:p}", render_list);
-        let mut debug_curr = (*render_list).next;
-        let mut debug_idx = 0;
-        while debug_curr != render_list {
-            let node = crate::container_of!(debug_curr, crate::wm_node::WmNode, link);
-            if let crate::wm_node::WmNodeType::Window(window) = (*node).get() {
-                let app_id = (*window).get_app_id_string().unwrap_or_default();
-                log::info!("[render_finish_loop] List[{}] = app_id={} state={:?}", debug_idx, app_id, (*window).state);
-            }
-            debug_curr = (*debug_curr).next;
-            debug_idx += 1;
-        }
-
         let mut found_fullscreen = false;
         curr = (*render_list).next;
         while curr != render_list {
@@ -1705,6 +1692,14 @@ impl WindowManager {
                             // off-screen reveal delay in overview/zoom).
                             let layer = if (*window).get_app_id_string().as_deref() == Some("cce-wallpaper") {
                                 (*self.server).scene.layers.background
+                            } else if (*window).is_grid() {
+                                // The grid client is a desktop fixture: above
+                                // the native backdrop and fallback cells
+                                // (layers.background) but under every window.
+                                // Left to the generic wm arm it stacks by
+                                // render-list order, burying whichever windows
+                                // happened to map before it.
+                                (*self.server).scene.layers.bottom
                             } else if rendered_fullscreen(window) {
                                 (*self.server).scene.layers.fullscreen
                             } else if (*window).tiling_mode == crate::tiling::TilingMode::Popup {