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