[PATCH v2] dix: offset touch root coordinates by ScreenRec origins (#86655)

Peter Hutterer peter.hutterer at who-t.net
Thu Dec 18 21:11:19 PST 2014


For two ScreenRecs abs pointer positioning was working fine, but touch events
stuck to the lower/right edge on any screen but the one with a 0/0 origin.
Cause is a missing offset by the screen coordinates, causing the root
coordinates in the event to desktop-wide, not screen-wide.

Offset properly, just like we do for pointer events.

X.Org Bug 86655 <http://bugs.freedesktop.org/show_bug.cgi?id=86655>

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
Changes to v1:
- also subtract screen origins in GetDixTouchEnd

I don't actually know what the exact sequence is to even trigger this (and
get the event delivered) but it requires some elaborate series of sync'd
touch grabs and likely ownership passing.
Either way, printf shows that the valuators are outside the range, so
offsetting them seems the right thing to do.

 dix/getevents.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/dix/getevents.c b/dix/getevents.c
index dd96265..6fb12c5 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -2044,7 +2044,7 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
 
     event->root = scr->root->drawable.id;
 
-    event_set_root_coordinates(event, screenx, screeny);
+    event_set_root_coordinates(event, screenx - scr->x, screeny - scr->y);
     event->touchid = client_id;
     event->flags = flags;
 
@@ -2082,8 +2082,8 @@ GetDixTouchEnd(InternalEvent *ievent, DeviceIntPtr dev, TouchPointInfoPtr ti,
     /* Get screen event coordinates from the sprite.  Is this really the best
      * we can do? */
     event_set_root_coordinates(event,
-                               dev->last.valuators[0],
-                               dev->last.valuators[1]);
+                               dev->last.valuators[0] - scr->x,
+                               dev->last.valuators[1] - scr->y);
     event->touchid = ti->client_id;
     event->flags = flags;
 
-- 
2.1.0



More information about the xorg-devel mailing list