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

commitc125e2322b8f6389b766ff218d1d9c0fba0ad0ff
parenta6baf1c92a
authorIsaac Freund <[email protected]>
date2021-08-02 16:16
river: fix crash on disabling all outputs

If using the on-output-change cursor warp option river currently crashes
when the last real output is disabled as the noop output used as a
fallback is not present in the output layout.

 river/Seat.zig | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/river/Seat.zig b/river/Seat.zig
index 0d25860..95a5e3f 100644
--- a/river/Seat.zig
+++ b/river/Seat.zig
@@ -256,6 +256,16 @@ pub fn setFocusRaw(self: *Self, new_focus: FocusTarget) void {
 pub fn focusOutput(self: *Self, output: *Output) void {
     if (self.focused_output == output) return;
 
+    var it = self.status_trackers.first;
+    while (it) |node| : (it = node.next) node.data.sendOutput(.unfocused);
+
+    self.focused_output = output;
+
+    it = self.status_trackers.first;
+    while (it) |node| : (it = node.next) node.data.sendOutput(.focused);
+
+    if (self.focused_output == &server.root.noop_output) return;
+
     // Warp pointer to center of newly focused output (In layout coordinates),
     // but only if cursor is not already on the output and this feature is enabled.
     switch (server.config.warp_cursor) {
@@ -272,14 +282,6 @@ pub fn focusOutput(self: *Self, output: *Output) void {
             }
         },
     }
-
-    var it = self.status_trackers.first;
-    while (it) |node| : (it = node.next) node.data.sendOutput(.unfocused);
-
-    self.focused_output = output;
-
-    it = self.status_trackers.first;
-    while (it) |node| : (it = node.next) node.data.sendOutput(.focused);
 }
 
 pub fn handleActivity(self: Self) void {