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