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

commit36da704ea574c974d4bc35557ea18d1d79ff5005
parent93808f28e7
authorIsaac Freund <[email protected]>
date2026-03-21 15:05
Seat: fix state reset on river_seat_v1 destroy

Currently makeInert() does not call Seat.opEnd() and handleDestroy()
does not do all the other stuff that makeInert() does. Unify these
functions and add more assertions.

 river/Seat.zig | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/river/Seat.zig b/river/Seat.zig
index f371132..799a73e 100644
--- a/river/Seat.zig
+++ b/river/Seat.zig
@@ -391,6 +391,12 @@ pub fn manageStart(seat: *Seat) void {
     if (server.wm.object) |wm_v1| {
         const new = seat.object == null;
         const seat_v1 = seat.object orelse blk: {
+            assert(seat.op == null);
+            assert(seat.layer_shell.object == null);
+            assert(seat.xkb_bindings_seat.object == null);
+            assert(seat.xkb_bindings.empty());
+            assert(seat.pointer_bindings.empty());
+
             const seat_v1 = river.SeatV1.create(wm_v1.getClient(), wm_v1.getVersion(), 0) catch {
                 log.err("out of memory", .{});
                 return; // try again next update
@@ -525,14 +531,13 @@ pub fn makeInert(seat: *Seat) void {
     if (seat.object) |seat_v1| {
         seat_v1.sendRemoved();
         seat_v1.setHandler(?*anyopaque, handleRequestInert, null, null);
-
-        seat.layer_shell.makeInert();
-        seat.xkb_bindings_seat.makeInert();
-
-        while (seat.xkb_bindings.first()) |binding| binding.destroy();
-        while (seat.pointer_bindings.first()) |binding| binding.destroy();
-
-        seat.object = null;
+        handleDestroy(seat_v1, seat);
+    } else {
+        assert(seat.op == null);
+        assert(seat.layer_shell.object == null);
+        assert(seat.xkb_bindings_seat.object == null);
+        assert(seat.xkb_bindings.empty());
+        assert(seat.pointer_bindings.empty());
     }
 }
 
@@ -547,6 +552,14 @@ fn handleRequestInert(
 fn handleDestroy(_: *river.SeatV1, seat: *Seat) void {
     seat.object = null;
     seat.opEnd();
+
+    seat.layer_shell.makeInert();
+    seat.xkb_bindings_seat.makeInert();
+
+    while (seat.xkb_bindings.first()) |binding| binding.destroy();
+    while (seat.pointer_bindings.first()) |binding| binding.destroy();
+
+    seat.object = null;
 }
 
 fn handleRequest(