Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
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);