summaryrefslogtreecommitdiff
path: root/dix
diff options
context:
space:
mode:
authorYuly Novikov <ynovikov@chromium.org>2012-11-19 21:04:57 -0500
committerPeter Hutterer <peter.hutterer@who-t.net>2012-11-20 16:06:06 +1000
commit3b9f1c701787965246638c1a6fd99fb2b6078114 (patch)
tree09a235c1f23fe218be5a87ba7eec5d7a4e790653 /dix
parentd0fd592fc7be1706084923f43fa057e50122562c (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>
Diffstat (limited to 'dix')
-rw-r--r--dix/getevents.c22
1 files changed, 8 insertions, 14 deletions
diff --git a/dix/getevents.c b/dix/getevents.c
index 9fc8047bd..fa538d9f4 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -1910,30 +1910,24 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
return 0;
}
- if (t->mode == XIDirectTouch) {
- if (!valuator_mask_isset(&mask, 0))
- valuator_mask_set_double(&mask, 0,
- valuator_mask_get_double(ti->
- valuators, 0));
- if (!valuator_mask_isset(&mask, 1))
- valuator_mask_set_double(&mask, 1,
- valuator_mask_get_double(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);
-
- 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(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(ti->valuators, i, &val))
+ valuator_mask_set_double(&mask, i, val);
}
+ transformAbsolute(dev, &mask);
clipAbsolute(dev, &mask);
}
else {