[PATCH] dix: Save touchpoint last coordinates before transform. #49347

Yuly Novikov ynovikov at chromium.org
Mon Nov 19 18:04:57 PST 2012


DDXTouchPointInfoRec.valuators used to store axis values after transform.
This resulted in Coordinate Transformation Matrix
being applied multiple times to the last coordinates,
in the case when only pressure changes in the last touch event.

Changed DDXTouchPointInfoRec.valuators to store values before transform.

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=49347

Signed-off-by: Yuly Novikov <ynovikov at chromium.org>
---
 dix/getevents.c    |   22 +++++++++-------------
 include/inputstr.h |    2 +-
 2 files changed, 10 insertions(+), 14 deletions(-)

diff --git a/dix/getevents.c b/dix/getevents.c
index 2a686e8..b52efc5 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -1940,32 +1940,28 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
     default:
         return 0;
     }
-    if (t->mode == XIDirectTouch && !(flags & TOUCH_CLIENT_ID)) {
-        if (!valuator_mask_isset(&mask, 0))
-            valuator_mask_set_double(&mask, 0,
-                                     valuator_mask_get_double(touchpoint.ti->
-                                                              valuators, 0));
-        if (!valuator_mask_isset(&mask, 1))
-            valuator_mask_set_double(&mask, 1,
-                                     valuator_mask_get_double(touchpoint.ti->
-                                                              valuators, 1));
-    }
 
     /* Get our screen event co-ordinates (root_x/root_y/event_x/event_y):
      * these come from the touchpoint in Absolute mode, or the sprite in
      * Relative. */
     if (t->mode == XIDirectTouch) {
-        transformAbsolute(dev, &mask);
-
         if (!(flags & TOUCH_CLIENT_ID)) {
-            for (i = 0; i < valuator_mask_size(&mask); i++) {
+            for (i = 0; i < max(valuator_mask_size(&mask), 2); i++) {
                 double val;
 
                 if (valuator_mask_fetch_double(&mask, i, &val))
                     valuator_mask_set_double(touchpoint.ti->valuators, i, val);
+                /* If the device doesn't post new X and Y axis values,
+                 * use the last values posted.
+                 */
+                else if (i < 2 &&
+                    valuator_mask_fetch_double(touchpoint.ti->valuators, i,
+                                               &val))
+                    valuator_mask_set_double(&mask, i, val);
             }
         }
 
+        transformAbsolute(dev, &mask);
         clipAbsolute(dev, &mask);
     }
     else {
diff --git a/include/inputstr.h b/include/inputstr.h
index 5a38924..bb0a779 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -331,7 +331,7 @@ typedef struct _DDXTouchPointInfo {
     uint32_t ddx_id;            /* touch ID given by the DDX */
     Bool emulate_pointer;
 
-    ValuatorMask *valuators;    /* last recorded axis values */
+    ValuatorMask *valuators;    /* last axis values as posted, pre-transform */
 } DDXTouchPointInfoRec;
 
 typedef struct _TouchClassRec {
-- 
1.7.7.3



More information about the xorg-devel mailing list