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

commitd915e2b20b4976cda6aee3109f8a7a4aa31caeae
parente2e1109983
authorIsaac Freund <[email protected]>
date2025-03-20 09:30
Decoration: fix destruction

 river/Decoration.zig          | 17 +++++++++++++++--
 river/Window.zig              |  5 +++++
 rivercompat/WindowManager.zig |  2 +-
 3 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/river/Decoration.zig b/river/Decoration.zig
index 7ad12dc..1b91c5f 100644
--- a/river/Decoration.zig
+++ b/river/Decoration.zig
@@ -87,12 +87,25 @@ pub fn create(
     return decoration;
 }
 
-fn handleDestroy(_: *river.DecorationV1, decoration: *Decoration) void {
+pub fn destroy(decoration: *Decoration) void {
+    decoration.object.setHandler(?*anyopaque, handleRequestInert, null, null);
     decoration.tree.node.destroy();
-
+    decoration.link.remove();
     util.gpa.destroy(decoration);
 }
 
+fn handleRequestInert(
+    node_v1: *river.DecorationV1,
+    request: river.DecorationV1.Request,
+    _: ?*anyopaque,
+) void {
+    if (request == .destroy) node_v1.destroy();
+}
+
+fn handleDestroy(_: *river.DecorationV1, decoration: *Decoration) void {
+    decoration.destroy();
+}
+
 fn handleRequest(
     decoration_v1: *river.DecorationV1,
     request: river.DecorationV1.Request,
diff --git a/river/Window.zig b/river/Window.zig
index e38f674..9373195 100644
--- a/river/Window.zig
+++ b/river/Window.zig
@@ -294,6 +294,7 @@ pub fn destroy(window: *Window, when: enum { lazy, assert }) void {
             return;
         },
     }
+    assert(window.object == null);
 
     {
         var it = server.input_manager.seats.iterator(.forward);
@@ -436,6 +437,10 @@ fn makeInert(window: *Window) void {
         window_v1.sendClosed();
         window_v1.setHandler(?*anyopaque, handleRequestInert, null, null);
         window.node.makeInert();
+        inline for (.{ &window.decorations_above, &window.decorations_below }) |decorations| {
+            var it = decorations.safeIterator(.forward);
+            while (it.next()) |decoration| decoration.destroy();
+        }
     } else {
         assert(window.node.object == null);
     }
diff --git a/rivercompat/WindowManager.zig b/rivercompat/WindowManager.zig
index b7743b1..ecd788d 100644
--- a/rivercompat/WindowManager.zig
+++ b/rivercompat/WindowManager.zig
@@ -95,7 +95,7 @@ fn updateWindowing(wm: *WindowManager) void {
         }
     }
     {
-        var it = wm.windows.iterator(.forward);
+        var it = wm.windows.safeIterator(.forward);
         while (it.next()) |window| {
             window.updateWindowing(wm);
         }