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

commit96f16cbbe24b6099de28e7600003dab7aa93eda2
parent0d0adac899
authorIsaac Freund <[email protected]>
date2024-03-15 15:24
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 => {},
+        }
     }
 }