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

commit1b7982c04e4d8909ae3009b9f214f21817fa655a
parent53d0786c20
authorIsaac Freund <[email protected]>
date2021-07-24 14:14
layout: cleanup in progress layout demand on destroy

This fixes an issue where a layout client that crashed during a layout
demand caused river to enter invalid state and potentially soft-lock.

 river/Layout.zig | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/river/Layout.zig b/river/Layout.zig
index 9fe6109..a8fe83b 100644
--- a/river/Layout.zig
+++ b/river/Layout.zig
@@ -173,13 +173,14 @@ pub fn destroy(self: *Self) void {
     const node = @fieldParentPtr(std.TailQueue(Self).Node, "data", self);
     self.output.layouts.remove(node);
 
-    // If we are the currently active layout of an output,  clean up. The output
-    // will always end up with no layout at this point, so we directly start the
-    // transaction.
-    if (self == self.output.pending.layout) {
+    // If we are the currently active layout of an output, clean up.
+    if (self.output.pending.layout == self) {
         self.output.pending.layout = null;
-        self.output.arrangeViews();
-        server.root.startTransaction();
+        if (self.output.layout_demand) |*layout_demand| {
+            layout_demand.deinit();
+            self.output.layout_demand = null;
+            server.root.notifyLayoutDemandDone();
+        }
     }
 
     self.layout.setHandler(?*c_void, handleRequestInert, null, null);