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

commit2f577d6e7312cbec633161a78cc538bf570ed6c4
parent65e10dc5db
authorIsaac Freund <[email protected]>
date2025-07-02 14:52
WindowManager: fix switching between wms

 river/Window.zig        | 5 +++++
 river/WindowManager.zig | 9 ++++++++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/river/Window.zig b/river/Window.zig
index 3799e6f..82d215c 100644
--- a/river/Window.zig
+++ b/river/Window.zig
@@ -368,6 +368,7 @@ pub fn updateWindowingStart(window: *Window) void {
                 window_v1.setHandler(*Window, handleRequest, handleDestroy, window);
                 wm_v1.sendWindow(window_v1);
 
+                window.node.link.remove();
                 server.wm.rendering_requested.list.append(&window.node);
 
                 break :blk window_v1;
@@ -436,6 +437,10 @@ fn handleRequestInert(
 fn handleDestroy(_: *river.WindowV1, window: *Window) void {
     window.object = null;
     window.node.makeInert();
+    inline for (.{ &window.decorations_above, &window.decorations_below }) |decorations| {
+        var it = decorations.iterator(.forward);
+        while (it.next()) |decoration| decoration.makeInert();
+    }
 }
 
 fn handleRequest(
diff --git a/river/WindowManager.zig b/river/WindowManager.zig
index 08195ab..b353a69 100644
--- a/river/WindowManager.zig
+++ b/river/WindowManager.zig
@@ -142,7 +142,14 @@ fn handleRequestInert(
 }
 
 fn handleDestroy(_: *river.WindowManagerV1, wm: *WindowManager) void {
+    log.debug("active river_window_manager_v1 destroyed", .{});
     wm.object = null;
+    switch (wm.state) {
+        .idle => {},
+        .inflight_configures => {},
+        .update_windowing => wm.updateWindowingFinish(),
+        .update_rendering => wm.updateRenderingFinish(),
+    }
 }
 
 fn handleRequest(
@@ -303,7 +310,7 @@ pub fn updateWindowingFinish(wm: *WindowManager) void {
 
     {
         // Order is important here, Seat.updateWindowingFinish() must be called
-        // before Window.updateWindowingFinish() are sent.
+        // before Window.updateWindowingFinish().
         var it = wm.windowing_sent.seats.iterator(.forward);
         while (it.next()) |seat| seat.updateWindowingFinish();
     }