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

commit7d7d1be307a7f0151af9c3a31c0019e5a5962f2d
parent1a67177377
authorIsaac Freund <[email protected]>
date2020-04-25 23:28
Deduplicate some state

 src/layer_surface.zig | 14 +++++---------
 src/output.zig        |  2 +-
 src/render.zig        |  2 +-
 3 files changed, 7 insertions(+), 11 deletions(-)

diff --git a/src/layer_surface.zig b/src/layer_surface.zig
index 38af53a..aa73217 100644
--- a/src/layer_surface.zig
+++ b/src/layer_surface.zig
@@ -11,9 +11,6 @@ pub const LayerSurface = struct {
     output: *Output,
     wlr_layer_surface: *c.wlr_layer_surface_v1,
 
-    /// True if the layer surface is currently mapped
-    mapped: bool,
-
     box: Box,
     layer: c.zwlr_layer_shell_v1_layer,
 
@@ -36,8 +33,6 @@ pub const LayerSurface = struct {
         self.wlr_layer_surface = wlr_layer_surface;
         wlr_layer_surface.data = self;
 
-        self.mapped = false;
-
         self.box = undefined;
         self.layer = layer;
 
@@ -79,8 +74,6 @@ pub const LayerSurface = struct {
 
         Log.Debug.log("Layer surface '{}' mapped.", .{wlr_layer_surface.namespace});
 
-        self.mapped = true;
-
         // Add listeners that are only active while mapped
         self.listen_commit.notify = handleCommit;
         c.wl_signal_add(&wlr_layer_surface.surface.*.events.commit, &self.listen_commit);
@@ -101,8 +94,6 @@ pub const LayerSurface = struct {
 
         Log.Debug.log("Layer surface '{}' unmapped.", .{self.wlr_layer_surface.namespace});
 
-        self.mapped = false;
-
         // remove listeners only active while the layer surface is mapped
         c.wl_list_remove(&self.listen_commit.link);
         c.wl_list_remove(&self.listen_new_popup.link);
@@ -118,6 +109,11 @@ pub const LayerSurface = struct {
             }
         }
 
+        // Slight hack: This is automatically set to false by wlroots after
+        // this callback is exited, but we need it set to false before calling
+        // arrangeLayers() to avoid a crash.
+        self.wlr_layer_surface.mapped = false;
+
         // This gives exclusive focus to a keyboard interactive top or overlay layer
         // surface if there is one.
         self.output.arrangeLayers();
diff --git a/src/output.zig b/src/output.zig
index a2b7de9..3e969b6 100644
--- a/src/output.zig
+++ b/src/output.zig
@@ -268,7 +268,7 @@ pub const Output = struct {
             while (it) |node| : (it = node.prev) {
                 const layer_surface = &node.data;
                 // Only mapped surfaces may gain focus
-                if (layer_surface.mapped and
+                if (layer_surface.wlr_layer_surface.mapped and
                     layer_surface.wlr_layer_surface.current.keyboard_interactive)
                 {
                     break :outer layer_surface;
diff --git a/src/render.zig b/src/render.zig
index 218b10a..9310c59 100644
--- a/src/render.zig
+++ b/src/render.zig
@@ -93,7 +93,7 @@ fn renderLayer(output: Output, layer: std.TailQueue(LayerSurface), now: *c.times
     var it = layer.first;
     while (it) |node| : (it = node.next) {
         const layer_surface = &node.data;
-        if (!layer_surface.mapped) {
+        if (!layer_surface.wlr_layer_surface.mapped) {
             continue;
         }
         var rdata = LayerSurfaceRenderData{