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

commita86e630649fe2949eea46720eae7a7e4408001bf
parentcedb6073c3
authorIsaac Freund <[email protected]>
date2025-03-23 10:02
rivercompat: fix closing windows

 rivercompat/Background.zig | 11 ++++-------
 rivercompat/Seat.zig       |  2 ++
 rivercompat/Window.zig     |  7 +++----
 3 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/rivercompat/Background.zig b/rivercompat/Background.zig
index 2ec3e6f..1b47990 100644
--- a/rivercompat/Background.zig
+++ b/rivercompat/Background.zig
@@ -26,15 +26,11 @@ const river = wayland.client.river;
 
 const wm = &@import("root").wm;
 
-const State = struct {
-    new: bool = false,
-};
-
+new: bool,
 surface: *wl.Surface,
 viewport: *wp.Viewport,
 shell_surface_v1: *river.ShellSurfaceV1,
 node: *river.NodeV1,
-pending: State,
 
 pub fn init(background: *Background) void {
     const surface = wm.compositor.createSurface() catch @panic("OOM");
@@ -42,16 +38,16 @@ pub fn init(background: *Background) void {
     const shell_surface_v1 = wm.wm_v1.getShellSurface(surface) catch @panic("OOM");
 
     background.* = .{
+        .new = true,
         .surface = surface,
         .viewport = viewport,
         .shell_surface_v1 = shell_surface_v1,
         .node = shell_surface_v1.getNode() catch @panic("OOM"),
-        .pending = .{ .new = true },
     };
 }
 
 pub fn updateWindowing(background: *Background) void {
-    if (background.pending.new) {
+    if (background.new) {
         background.node.placeBottom();
         background.node.setPosition(0, 0);
         background.shell_surface_v1.syncNextCommit();
@@ -72,4 +68,5 @@ pub fn updateWindowing(background: *Background) void {
         background.viewport.setDestination(math.maxInt(i32) / 2, math.maxInt(i32) / 2);
         background.surface.commit();
     }
+    background.new = false;
 }
diff --git a/rivercompat/Seat.zig b/rivercompat/Seat.zig
index 4ffcdd0..a47d37d 100644
--- a/rivercompat/Seat.zig
+++ b/rivercompat/Seat.zig
@@ -174,7 +174,9 @@ pub fn focus(seat: *Seat, _target: ?*Window) void {
         window.link_focus.remove();
         seat.focused_output.?.stack_focus.prepend(window);
         seat.seat_v1.focusWindow(window.window_v1);
+        seat.focused = window;
     } else {
         seat.seat_v1.clearFocus();
+        seat.focused = null;
     }
 }
diff --git a/rivercompat/Window.zig b/rivercompat/Window.zig
index 12d492c..6d35380 100644
--- a/rivercompat/Window.zig
+++ b/rivercompat/Window.zig
@@ -113,6 +113,8 @@ pub fn updateWindowing(window: *Window) void {
     if (window.windowing.closed) {
         window.window_v1.destroy();
         window.link.remove();
+        window.link_focus.remove();
+        window.link_wm.remove();
         {
             var it = wm.seats.iterator(.forward);
             while (it.next()) |seat| {
@@ -180,10 +182,7 @@ pub const Box = struct {
     height: u31,
 };
 
-pub fn layout(
-    window: *Window,
-    box: Box,
-) void {
+pub fn layout(window: *Window, box: Box) void {
     window.x = box.x + wm.config.border_width;
     window.y = box.y + wm.config.border_width;
     window.node_v1.setPosition(window.x, window.y);