From c34d850397380a67e864a3c271149f4c040b919a Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Tue, 21 Dec 2021 19:36:22 +0000 Subject: [PATCH] layer-shell: fix regression from wlroots 0.15 update The way wlroots handles the layer surface configure flow has changed a bit and river's logic needs updating. --- deps/zig-wlroots | 2 +- river/LayerSurface.zig | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/deps/zig-wlroots b/deps/zig-wlroots index e2be6fb..9e2fc0d 160000 --- a/deps/zig-wlroots +++ b/deps/zig-wlroots @@ -1 +1 @@ -Subproject commit e2be6fbcc25694e111defdd41de9096802bf049a +Subproject commit 9e2fc0dd6dfbd47c56fe10e260255e13cc5f114d diff --git a/river/LayerSurface.zig b/river/LayerSurface.zig index 68f2dc8..1a94f08 100644 --- a/river/LayerSurface.zig +++ b/river/LayerSurface.zig @@ -21,6 +21,7 @@ const std = @import("std"); const assert = std.debug.assert; const wlr = @import("wlroots"); const wl = @import("wayland").server.wl; +const zwlr = @import("wayland").server.zwlr; const server = &@import("main.zig").server; const util = @import("util.zig"); @@ -36,7 +37,7 @@ output: *Output, wlr_layer_surface: *wlr.LayerSurfaceV1, box: Box = undefined, -state: wlr.LayerSurfaceV1.State, +layer: zwlr.LayerShellV1.Layer, destroy: wl.Listener(*wlr.LayerSurfaceV1) = wl.Listener(*wlr.LayerSurfaceV1).init(handleDestroy), map: wl.Listener(*wlr.LayerSurfaceV1) = wl.Listener(*wlr.LayerSurfaceV1).init(handleMap), @@ -49,7 +50,7 @@ pub fn init(self: *Self, output: *Output, wlr_layer_surface: *wlr.LayerSurfaceV1 self.* = .{ .output = output, .wlr_layer_surface = wlr_layer_surface, - .state = wlr_layer_surface.current, + .layer = wlr_layer_surface.current.layer, }; wlr_layer_surface.data = @ptrToInt(self); @@ -100,7 +101,7 @@ fn handleMap(listener: *wl.Listener(*wlr.LayerSurfaceV1), wlr_layer_surface: *wl wlr_layer_surface.surface.sendEnter(wlr_layer_surface.output.?); const node = @fieldParentPtr(std.TailQueue(Self).Node, "data", self); - self.output.getLayer(self.state.layer).append(node); + self.output.getLayer(self.layer).append(node); self.output.arrangeLayers(.mapped); } @@ -111,7 +112,7 @@ fn handleUnmap(listener: *wl.Listener(*wlr.LayerSurfaceV1), wlr_layer_surface: * // Remove from the output's list of layer surfaces const self_node = @fieldParentPtr(std.TailQueue(Self).Node, "data", self); - self.output.layers[@intCast(usize, @enumToInt(self.state.layer))].remove(self_node); + self.output.layers[@intCast(usize, @enumToInt(self.layer))].remove(self_node); // If the unmapped surface is focused, clear focus var it = server.input_manager.seats.first; @@ -144,23 +145,22 @@ fn handleCommit(listener: *wl.Listener(*wlr.Surface), wlr_surface: *wlr.Surface) // If a surface is committed while it is not mapped, we may need to send a configure. if (!self.wlr_layer_surface.mapped) { const node = @fieldParentPtr(std.TailQueue(Self).Node, "data", self); - self.output.getLayer(self.state.layer).append(node); + self.layer = self.wlr_layer_surface.current.layer; + self.output.getLayer(self.layer).append(node); self.output.arrangeLayers(.unmapped); - self.output.getLayer(self.state.layer).remove(node); + self.output.getLayer(self.layer).remove(node); return; } - const new_state = &self.wlr_layer_surface.current; - if (!std.meta.eql(self.state, new_state.*)) { + if (self.wlr_layer_surface.current.committed != 0) { // If the layer changed, move the LayerSurface to the proper list - if (self.state.layer != new_state.layer) { + if (self.wlr_layer_surface.current.layer != self.layer) { const node = @fieldParentPtr(std.TailQueue(Self).Node, "data", self); - self.output.getLayer(self.state.layer).remove(node); - self.output.getLayer(new_state.layer).append(node); + self.output.getLayer(self.layer).remove(node); + self.layer = self.wlr_layer_surface.current.layer; + self.output.getLayer(self.layer).append(node); } - self.state = new_state.*; - self.output.arrangeLayers(.mapped); server.root.startTransaction(); }