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