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

commit46c8e99a3b14b17965140d9e7fbaa585d5e66885
parent637bc237c4
authorIsaac Freund <[email protected]>
date2023-03-01 19:40
Output: fix background of transformed outputs

 river/Output.zig | 26 +++++++++++++-------------
 river/Root.zig   |  5 +++++
 2 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/river/Output.zig b/river/Output.zig
index a297bc9..4c34436 100644
--- a/river/Output.zig
+++ b/river/Output.zig
@@ -395,22 +395,22 @@ fn handleEnable(listener: *wl.Listener(*wlr.Output), wlr_output: *wlr.Output) vo
 }
 
 fn handleMode(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void {
-    const self = @fieldParentPtr(Self, "mode", listener);
+    const output = @fieldParentPtr(Self, "mode", listener);
 
-    {
-        var width: c_int = undefined;
-        var height: c_int = undefined;
-        self.wlr_output.effectiveResolution(&width, &height);
-        self.layers.background_color_rect.setSize(width, height);
-
-        var it = self.layers.fullscreen.children.iterator(.forward);
-        const background_color_rect = @fieldParentPtr(wlr.SceneRect, "node", it.next().?);
-        background_color_rect.setSize(width, height);
+    output.updateBackgroundRect();
+    output.arrangeLayers();
+    server.root.applyPending();
+}
 
-        log.info("new output mode, width: {}, height: {}", .{ width, height });
-    }
+pub fn updateBackgroundRect(output: *Self) void {
+    var width: c_int = undefined;
+    var height: c_int = undefined;
+    output.wlr_output.effectiveResolution(&width, &height);
+    output.layers.background_color_rect.setSize(width, height);
 
-    server.root.applyPending();
+    var it = output.layers.fullscreen.children.iterator(.forward);
+    const fullscreen_background = @fieldParentPtr(wlr.SceneRect, "node", it.next().?);
+    fullscreen_background.setSize(width, height);
 }
 
 fn handleFrame(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void {
diff --git a/river/Root.zig b/river/Root.zig
index 9fb516f..f989796 100644
--- a/river/Root.zig
+++ b/river/Root.zig
@@ -729,6 +729,11 @@ fn processOutputConfig(
                         self.output_layout.add(output.wlr_output, head.state.x, head.state.y);
                         output.tree.node.setEnabled(true);
                         output.tree.node.setPosition(head.state.x, head.state.y);
+                        // Even though we call this in the output's handler for the mode event
+                        // it is necessary to call it here as well since changing e.g. only
+                        // the transform will require the dimensions of the background to be
+                        // updated but will not trigger a mode event.
+                        output.updateBackgroundRect();
                         output.arrangeLayers();
                     } else {
                         self.removeOutput(output);