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

commit1a69486120ed133308494089cbca16ae1679bcc5
parenta8e266b285
authorLucas Galante <[email protected]>
date2026-06-15 12:16
Fix border color depth calculation for unfocused windows

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

diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index 009ef07..1f3a741 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -619,6 +619,18 @@ impl WindowManager {
             curr_seat = next_seat;
         }
 
+        let mut stack_order: Vec<*mut Window> = Vec::new();
+        let render_list = &mut self.rendering_requested.list as *mut ffi::wl_list as *mut WlList;
+        let mut curr = (*render_list).next;
+        while curr != render_list {
+            let next = (*curr).next;
+            let node = crate::container_of!(curr, crate::wm_node::WmNode, link);
+            if let crate::wm_node::WmNodeType::Window(window) = (*node).get() {
+                stack_order.push(window);
+            }
+            curr = next;
+        }
+
         for &output in &active_outputs {
             let wlr_box = (*output).sent.box_layout();
             let phys_x = wlr_box.x;
@@ -787,7 +799,9 @@ impl WindowManager {
                         self.layout.border_a,
                     )
                 } else {
-                    let pos = tiled_windows.iter().position(|&w| w == win_ptr).unwrap_or(0);
+                    let mut tiled_stack = tiled_windows.clone();
+                    tiled_stack.sort_by_key(|&w| stack_order.iter().position(|&x| x == w).unwrap_or(usize::MAX));
+                    let pos = tiled_stack.iter().position(|&w| w == win_ptr).unwrap_or(0);
                     let depth = n_tiled - 1 - pos as i32;
                     let mut factor = 1.0_f64;
                     for _ in 0..depth {