kdrive: modify ephyr events to use POINTER_DESKTOP and scale them to that
authorPeter Hutterer <peter.hutterer@who-t.net>
Tue, 29 Oct 2013 04:24:41 +0000 (14:24 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Thu, 14 Nov 2013 03:34:23 +0000 (13:34 +1000)
A multi-head Xephyr instance has the pointer stuck on one screen
because of bad coordinate calculation. The coordinates passed to
GetPointerEvents are per-screen, so the cursor gets stuck on the left-most
screen by default.

Adjust and mark the events as POINTER_DESKTOP, so the DIX
can adjust them accordingly.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Keith Packard <keithp@keithp.com>
hw/kdrive/ephyr/ephyr.c
hw/kdrive/src/kdrive.h
hw/kdrive/src/kinput.c

index 91e949d..ef4b321 100644 (file)
@@ -959,7 +959,14 @@ ephyrProcessMouseMotion(xcb_generic_event_t *xev)
         }
         EPHYR_LOG("final (x,y):(%d,%d)\n", x, y);
 #endif
-        KdEnqueuePointerEvent(ephyrMouse, mouseState, x, y, 0);
+
+        /* convert coords into desktop-wide coordinates.
+         * fill_pointer_events will convert that back to
+         * per-screen coordinates where needed */
+        x += screen->pScreen->x;
+        y += screen->pScreen->y;
+
+        KdEnqueuePointerEvent(ephyrMouse, mouseState | KD_POINTER_DESKTOP, x, y, 0);
     }
 }
 
index d5d0799..296d611 100644 (file)
@@ -506,6 +506,7 @@ KdEnqueueKeyboardEvent(KdKeyboardInfo * ki, unsigned char scan_code,
 #define KD_BUTTON_4    0x08
 #define KD_BUTTON_5    0x10
 #define KD_BUTTON_8    0x80
+#define KD_POINTER_DESKTOP 0x40000000
 #define KD_MOUSE_DELTA 0x80000000
 
 void
index d845830..abda693 100644 (file)
@@ -1895,6 +1895,8 @@ KdEnqueuePointerEvent(KdPointerInfo * pi, unsigned long flags, int rx, int ry,
     }
     else {
         dixflags = POINTER_ABSOLUTE;
+        if (flags & KD_POINTER_DESKTOP)
+            dixflags |= POINTER_DESKTOP;
         if (x != pi->dixdev->last.valuators[0] ||
             y != pi->dixdev->last.valuators[1])
             _KdEnqueuePointerEvent(pi, MotionNotify, x, y, z, 0, dixflags,