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

commitb99938747dff3557cc2028d603c8ae5ce01c0b6b
parenta12385f56a
authorLucas Galante <[email protected]>
date2026-08-05 14:46
fix: hash status-segment expansion into the render order hash

The render_finish reorder pass only reparents windows into their
layers when the order hash changes, but the hash omitted the one input
that moves a status segment between layers.top and layers.popups: its
expanded state (thickness vs bar height). Opening an in-surface menu
therefore left the expanded segment stacked under its sibling
segments — their text drew sharp over the menu instead of frosted
under its blur — until an unrelated reorder happened along.

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

 src/server/window_manager.rs | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index f34a9be..f34868c 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -1413,6 +1413,21 @@ impl WindowManager {
                     (*window).rendering_requested.circular.hash(&mut hasher);
                     (*window).rendering_requested.hidden.hash(&mut hasher);
                     (*window).tiling_mode.hash(&mut hasher);
+                    // A status segment's layer flips between top and popups
+                    // on expand/contract (see the reorder pass below), so
+                    // expansion state must participate in the hash — without
+                    // it the restack waits for an unrelated reorder, and the
+                    // open menu sits UNDER its sibling segments (their text
+                    // stays unblurred over the menu) until one happens.
+                    if (*window).tiling_mode == crate::tiling::TilingMode::Status {
+                        let bg = (*window).box_geom;
+                        let thickness = match (*window).status_edge {
+                            crate::policy::arrange::StatusEdge::Left
+                            | crate::policy::arrange::StatusEdge::Right => bg.width,
+                            _ => bg.height,
+                        };
+                        (thickness > self.layout.bar_height).hash(&mut hasher);
+                    }
                 }
                 crate::wm_node::WmNodeType::ShellSurface(shell_surface) => {
                     (shell_surface as usize).hash(&mut hasher);