diff --git a/deps/zig-wlroots b/deps/zig-wlroots index 04bcd67..0c3165f 160000 --- a/deps/zig-wlroots +++ b/deps/zig-wlroots @@ -1 +1 @@ -Subproject commit 04bcd67d520f736f8223e2699a363be763c3c418 +Subproject commit 0c3165f483d322a7b95f06ed5105782736444961 diff --git a/river/Root.zig b/river/Root.zig index 5fac20c..1a18da4 100644 --- a/river/Root.zig +++ b/river/Root.zig @@ -19,6 +19,7 @@ const Self = @This(); const build_options = @import("build_options"); const std = @import("std"); const assert = std.debug.assert; +const mem = std.mem; const wlr = @import("wlroots"); const wl = @import("wayland").server.wl; @@ -450,58 +451,30 @@ fn processOutputConfig( const wlr_output = head.state.output; const output = @intToPtr(*Output, wlr_output.data); - if (head.state.enabled) { - wlr_output.enable(true); + var proposed_state = wlr.Output.State.init(); + head.state.apply(&proposed_state); - if (head.state.mode) |mode| { - wlr_output.setMode(mode); - } else { - const custom_mode = &head.state.custom_mode; - wlr_output.setCustomMode(custom_mode.width, custom_mode.height, custom_mode.refresh); - } - wlr_output.setScale(head.state.scale); - wlr_output.setTransform(head.state.transform); - wlr_output.enableAdaptiveSync(head.state.adaptive_sync_enabled); - - switch (action) { - .test_only => { - if (!output.wlr_output.testCommit()) success = false; - output.wlr_output.rollback(); - }, - .apply => { - if (output.wlr_output.commit()) { + switch (action) { + .test_only => { + if (!wlr_output.testState(&proposed_state)) success = false; + }, + .apply => { + if (wlr_output.commitState(&proposed_state)) { + if (head.state.enabled) { // Just updates the output's position if it is already in the layout self.output_layout.add(output.wlr_output, head.state.x, head.state.y); output.arrangeLayers(.mapped); - } else |_| { - std.log.scoped(.output_manager).err("failed to apply config to output {s}", .{output.wlr_output.name}); - success = false; - } - }, - } - } else { - // The output is already disabled, so there's nothing to do - if (!wlr_output.enabled) continue; - - wlr_output.enable(false); - - switch (action) { - .test_only => { - if (!output.wlr_output.testCommit()) success = false; - output.wlr_output.rollback(); - }, - .apply => { - if (output.wlr_output.commit()) { + } else { self.removeOutput(output); self.output_layout.remove(output.wlr_output); - } else |_| { - std.log.scoped(.output_manager).err("failed to apply config to output {s}", .{ - output.wlr_output.name, - }); - success = false; } - }, - } + } else |_| { + std.log.scoped(.output_manager).err("failed to apply config to output {s}", .{ + output.wlr_output.name, + }); + success = false; + } + }, } }