output: simplify layer shell handling on destroy

No need for noop output hacks here, wlr.LayerSurfaceV1.close()
synchronously emits the unmap signal if the layer surface is mapped.
This commit is contained in:
Isaac Freund 2021-08-12 21:58:17 +02:00
parent 1e18ac9d74
commit d4c249a5cb
No known key found for this signature in database
GPG key ID: 86DED400DDFD7A11

View file

@ -178,17 +178,15 @@ pub fn removeOutput(self: *Self, output: *Output) void {
} }
// Close all layer surfaces on the removed output // Close all layer surfaces on the removed output
for (output.layers) |*layer, layer_idx| { for (output.layers) |*layer| {
while (layer.pop()) |layer_node| { // Closing the layer surface will cause LayerSurface.handleUnmap()
// to be called synchronously, which will remove it from this list.
while (layer.first) |layer_node| {
const layer_surface = &layer_node.data; const layer_surface = &layer_node.data;
// We need to move the closing layer surface to the noop output
// since it may not be immediately destoryed. This just a request
// to close which will trigger unmap and destroy events in
// response, and the LayerSurface needs a valid output to
// handle them.
self.noop_output.layers[layer_idx].prepend(layer_node);
layer_surface.output = &self.noop_output;
layer_surface.wlr_layer_surface.close(); layer_surface.wlr_layer_surface.close();
layer_surface.wlr_layer_surface.output = null;
layer_surface.output = undefined;
} }
} }