[PATCH xwayland 5/7] xwayland: Emit relative motion events on both warp/confinement situations

Carlos Garnacho carlosg at gnome.org
Sat Nov 12 16:25:20 UTC 2016


But just as long as the cursor is hidden. In the typical pattern in
games of "hide cursor, grab with a confineTo, warp constantly the pointer
to the middle of the window" the last warping step is actually rather
optional.

Some games may choose to just set up a grab with confineTo argument,
and trust that they'll get correct relative X/Y axis values despite
the hidden cursor hitting the confinement window edge.

This makes Xwayland able to handle that pattern, downside is that
perhaps clinging further on the x_cursor == NULL heuristic. Whenever
the cursor is made visible again, the pointer will appear at whatever
position it was left in, and Xwayland will switch back to using abs
coordinates.

Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
---
 hw/xwayland/xwayland-input.c | 39 ++++++++++++++++-----------------------
 1 file changed, 16 insertions(+), 23 deletions(-)

diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index 7ec3b1a..e5dbe4f 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -47,11 +47,7 @@ struct sync_pending {
 };
 
 static void
-xwl_pointer_warp_emulator_handle_motion(struct xwl_pointer_warp_emulator *warp_emulator,
-                                        double dx,
-                                        double dy,
-                                        double dx_unaccel,
-                                        double dy_unaccel);
+xwl_pointer_warp_emulator_update(struct xwl_pointer_warp_emulator *warp_emulator);
 static void
 xwl_pointer_warp_emulator_maybe_lock(struct xwl_pointer_warp_emulator *warp_emulator,
                                      struct xwl_window *xwl_window,
@@ -375,8 +371,10 @@ dispatch_pointer_motion_event(struct xwl_seat *xwl_seat)
 {
     ValuatorMask mask;
 
-    if (xwl_seat->pointer_warp_emulator &&
-        xwl_seat->pending_pointer_event.has_relative) {
+    if (xwl_seat->pending_pointer_event.has_relative &&
+        xwl_seat->x_cursor == NULL &&
+        (xwl_seat->pointer_warp_emulator ||
+         xwl_seat->cursor_confinement_window)) {
         double dx;
         double dy;
         double dx_unaccel;
@@ -386,9 +384,16 @@ dispatch_pointer_motion_event(struct xwl_seat *xwl_seat)
         dy = xwl_seat->pending_pointer_event.dy;
         dx_unaccel = xwl_seat->pending_pointer_event.dx_unaccel;
         dy_unaccel = xwl_seat->pending_pointer_event.dy_unaccel;
-        xwl_pointer_warp_emulator_handle_motion(xwl_seat->pointer_warp_emulator,
-                                                dx, dy,
-                                                dx_unaccel, dy_unaccel);
+
+        valuator_mask_zero(&mask);
+        valuator_mask_set_unaccelerated(&mask, 0, dx, dx_unaccel);
+        valuator_mask_set_unaccelerated(&mask, 1, dy, dy_unaccel);
+
+        QueuePointerEvents(xwl_seat->relative_pointer, MotionNotify, 0,
+                           POINTER_RELATIVE, &mask);
+
+        if (xwl_seat->pointer_warp_emulator)
+            xwl_pointer_warp_emulator_update(xwl_seat->pointer_warp_emulator);
     } else if (xwl_seat->pending_pointer_event.has_absolute ||
                xwl_seat->pending_pointer_event.has_relative) {
         int x;
@@ -1414,24 +1419,12 @@ xwl_pointer_warp_emulator_warp(struct xwl_pointer_warp_emulator *warp_emulator,
 }
 
 static void
-xwl_pointer_warp_emulator_handle_motion(struct xwl_pointer_warp_emulator *warp_emulator,
-                                        double dx,
-                                        double dy,
-                                        double dx_unaccel,
-                                        double dy_unaccel)
+xwl_pointer_warp_emulator_update(struct xwl_pointer_warp_emulator *warp_emulator)
 {
     struct xwl_seat *xwl_seat = warp_emulator->xwl_seat;
-    ValuatorMask mask;
     WindowPtr window;
     int x, y;
 
-    valuator_mask_zero(&mask);
-    valuator_mask_set_unaccelerated(&mask, 0, dx, dx_unaccel);
-    valuator_mask_set_unaccelerated(&mask, 1, dy, dy_unaccel);
-
-    QueuePointerEvents(xwl_seat->relative_pointer, MotionNotify, 0,
-                       POINTER_RELATIVE, &mask);
-
     window = xwl_seat->focus_window->window;
     miPointerGetPosition(xwl_seat->pointer, &x, &y);
 
-- 
2.9.3



More information about the xorg-devel mailing list