diff --git a/river/Output.zig b/river/Output.zig index a297bc9..4c34436 100644 --- a/river/Output.zig +++ b/river/Output.zig @@ -395,24 +395,24 @@ 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); - - { - 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); - - log.info("new output mode, width: {}, height: {}", .{ width, height }); - } + const output = @fieldParentPtr(Self, "mode", listener); + output.updateBackgroundRect(); + output.arrangeLayers(); server.root.applyPending(); } +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); + + 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 { const output = @fieldParentPtr(Self, "frame", listener); const scene_output = server.root.scene.getSceneOutput(output.wlr_output).?; 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);