aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac Freund <mail@isaacfreund.com>2023-01-24 13:55:40 +0100
committerIsaac Freund <mail@isaacfreund.com>2023-01-24 13:55:40 +0100
commit946173005d13a9745dec6a31d30355cc697bf6e3 (patch)
treec72bed97fd0bf24494c70303194c40fe560d7360
parent4c6f47669bbd869fea22841601f9fe98aa6ed52e (diff)
downloadriver-946173005d13a9745dec6a31d30355cc697bf6e3.tar.gz
river-946173005d13a9745dec6a31d30355cc697bf6e3.tar.xz
wlr-output-management: leverage new wlroots APIs
These new functions allow testing commits without messing up the pending state of the output and needing to rollback. The new apply() function also makes the code considerably more concise.
m---------deps/zig-wlroots0
-rw-r--r--river/Root.zig63
2 files changed, 18 insertions, 45 deletions
diff --git a/deps/zig-wlroots b/deps/zig-wlroots
-Subproject 04bcd67d520f736f8223e2699a363be763c3c41
+Subproject 0c3165f483d322a7b95f06ed510578273644496
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;
+ }
+ },
}
}