Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
XdgToplevel: validate move/resize request serial
Currently we only support interactive move/resize with the pointer,
touch and tablet tool support are TODO.
Validate the serial here to ensure we don't start a pointer move/resize
in response to the client attempting to start a move/resize with
touch/tablet tool.
This fixes an assertion failure that the pointer's cursor is not hidden
during move/resize, which is how the issue was discovered. Another win
for assertions :)
river/XdgToplevel.zig | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/river/XdgToplevel.zig b/river/XdgToplevel.zig
index 76e73a6..1e99a3c 100644
--- a/river/XdgToplevel.zig
+++ b/river/XdgToplevel.zig
@@ -427,9 +427,12 @@ fn handleRequestMove(
if (view.pending.fullscreen) return;
if (!(view.pending.float or view.pending.output.?.layout == null)) return;
- switch (seat.cursor.mode) {
- .passthrough, .down => seat.cursor.startMove(view),
- .move, .resize => {},
+ // Moving windows with touch or tablet tool is not yet supported.
+ if (seat.wlr_seat.validatePointerGrabSerial(null, event.serial)) {
+ switch (seat.cursor.mode) {
+ .passthrough, .down => seat.cursor.startMove(view),
+ .move, .resize => {},
+ }
}
}
@@ -443,9 +446,12 @@ fn handleRequestResize(listener: *wl.Listener(*wlr.XdgToplevel.event.Resize), ev
if (view.pending.fullscreen) return;
if (!(view.pending.float or view.pending.output.?.layout == null)) return;
- switch (seat.cursor.mode) {
- .passthrough, .down => seat.cursor.startResize(view, event.edges),
- .move, .resize => {},
+ // Resizing windows with touch or tablet tool is not yet supported.
+ if (seat.wlr_seat.validatePointerGrabSerial(null, event.serial)) {
+ switch (seat.cursor.mode) {
+ .passthrough, .down => seat.cursor.startResize(view, event.edges),
+ .move, .resize => {},
+ }
}
}