summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuly Novikov <ynovikov@chromium.org>2012-11-19 21:04:57 -0500
committerPeter Hutterer <peter.hutterer@who-t.net>2013-01-21 14:09:59 +1000
commit310ac850805364c39c8f36a6a1d4fc54b952ad9d (patch)
tree9c54c94ba6d909ef3e169ba1ccaf112b0a72bbe3
parentd07dfb11c29172df12f8c86213e8c1488aa2d527 (diff)
dix: Save touchpoint last coordinates before transform. #49347
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@chromium.org> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> (cherry picked from commit 3b9f1c701787965246638c1a6fd99fb2b6078114) Conflicts: dix/getevents.c
-rw-r--r--dix/getevents.c31
-rw-r--r--include/inputstr.h2
2 files changed, 14 insertions, 19 deletions
diff --git a/dix/getevents.c b/dix/getevents.c
index 8b4379d1c..241fcfd69 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -1951,32 +1951,27 @@ 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++) {
- double val;
-
- if (valuator_mask_fetch_double(&mask, i, &val))
- valuator_mask_set_double(touchpoint.ti->valuators, i, val);
- }
+ 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 227ad7a68..3b16e210d 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -335,7 +335,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 {