blob: c7e25cacda655f7ebc373fd8037a454a124f7b6f [file] [log] [blame]
From e2e273e135bcdadde22c48cf2d70cbd22f268120 Mon Sep 17 00:00:00 2001
From: Yuly Novikov <ynovikov@chromium.org>
Date: Mon, 19 Nov 2012 21:04:57 -0500
Subject: [PATCH] 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
BUG=chromium-os:36115
TEST=Follow the expected output in the bug desription.
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
---
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 7454cb4..f1e7491 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -1895,32 +1895,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 841e805..bce46cb 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