Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
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);
}