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.
This commit is contained in:
Isaac Freund 2021-07-24 14:14:36 +02:00
parent 6f91011895
commit 9c633a7888
No known key found for this signature in database
GPG key ID: 86DED400DDFD7A11

View file

@ -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);