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

commit9b12ddc046efcc9f5b1aa42f66a0a2903d716fd8
parent629f660141
authorIsaac Freund <[email protected]>
date2025-12-12 14:09
WindowManager: fix fullscreen-related rendering order

Currently, window placed above a fullscreen window in the render list
by the wm are not rendered, even if they are on a different output and
should be visible. This commit fixes the ordering in the presence of
fullscreen windows.

 river/WindowManager.zig | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/river/WindowManager.zig b/river/WindowManager.zig
index 3438d10..f3a2c12 100644
--- a/river/WindowManager.zig
+++ b/river/WindowManager.zig
@@ -432,7 +432,7 @@ fn renderFinish(wm: *WindowManager) void {
     }
 
     {
-        var found_fullscreen: bool = false;
+        var bottom_fullscreen: ?*Window = null;
         var it = wm.rendering_requested.list.iterator(.forward);
         while (it.next()) |node| {
             switch (node.get()) {
@@ -441,13 +441,13 @@ fn renderFinish(wm: *WindowManager) void {
                     window.tree.node.reparent(server.scene.layers.wm);
                     window.popup_tree.node.reparent(server.scene.layers.popups);
                     if (window.wm_requested.fullscreen != null) {
-                        found_fullscreen = true;
+                        if (bottom_fullscreen == null) {
+                            bottom_fullscreen = window;
+                        }
                         window.tree.node.raiseToTop();
-                    }
-                    // Rendering order for windows below the top fullscreen window
-                    // (if present) does not matter, as they will be fully obscured
-                    // by the opaque black fullscreen background rect.
-                    if (!found_fullscreen) {
+                    } else if (bottom_fullscreen) |bf| {
+                        window.tree.node.placeBelow(&bf.tree.node);
+                    } else {
                         window.tree.node.raiseToTop();
                     }
                 },