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

commit13df7b2c62e135425be3f4caad9ac368c4c0fc33
parentd065acde4d
authorGabriel Sanches <[email protected]>
date2025-12-17 10:11
Scene: place fullscreen windows on new layer

This ensures that fullscreen windows are rendered above layer shell
surfaces on the "top" layer, as expected.

 river/Scene.zig         | 3 +++
 river/WindowManager.zig | 9 ++-------
 2 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/river/Scene.zig b/river/Scene.zig
index 6e23c83..64636a2 100644
--- a/river/Scene.zig
+++ b/river/Scene.zig
@@ -50,6 +50,8 @@ layers: struct {
     wm: *wlr.SceneTree,
     /// Top layer shell layer
     top: *wlr.SceneTree,
+    /// Fullscreen windows and river shell surfaces placed above them.
+    fullscreen: *wlr.SceneTree,
     /// Overlay layer shell layer
     overlay: *wlr.SceneTree,
     /// Popups from xdg-shell and input-method-v2 clients
@@ -87,6 +89,7 @@ pub fn init(scene: *Scene) !void {
             .bottom = try normal_tree.createSceneTree(),
             .wm = try normal_tree.createSceneTree(),
             .top = try normal_tree.createSceneTree(),
+            .fullscreen = try normal_tree.createSceneTree(),
             .overlay = try normal_tree.createSceneTree(),
             .popups = try normal_tree.createSceneTree(),
             .override_redirect = if (build_options.xwayland) try normal_tree.createSceneTree(),
diff --git a/river/WindowManager.zig b/river/WindowManager.zig
index e2cca60..385bfb7 100644
--- a/river/WindowManager.zig
+++ b/river/WindowManager.zig
@@ -447,22 +447,17 @@ fn renderFinish(wm: *WindowManager) void {
     }
 
     {
-        var bottom_fullscreen: ?*Window = null;
         var it = wm.rendering_requested.list.iterator(.forward);
         while (it.next()) |node| {
             switch (node.get()) {
                 .window => |window| {
                     window.renderFinish();
-                    window.tree.node.reparent(server.scene.layers.wm);
                     window.popup_tree.node.reparent(server.scene.layers.popups);
                     if (window.wm_requested.fullscreen != null) {
-                        if (bottom_fullscreen == null) {
-                            bottom_fullscreen = window;
-                        }
+                        window.tree.node.reparent(server.scene.layers.fullscreen);
                         window.tree.node.raiseToTop();
-                    } else if (bottom_fullscreen) |bf| {
-                        window.tree.node.placeBelow(&bf.tree.node);
                     } else {
+                        window.tree.node.reparent(server.scene.layers.wm);
                         window.tree.node.raiseToTop();
                     }
                 },