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

commitff86e52f64e0b453b0f2ebc99ee8248870ef75f6
parentd11a53d343
authorIsaac Freund <[email protected]>
date2023-01-24 13:55
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.

 deps/zig-wlroots |  2 +-
 river/Root.zig   | 63 ++++++++++++++++----------------------------------------
 2 files changed, 19 insertions(+), 46 deletions(-)

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;
+                }
+            },
         }
     }