From 3b9f1c701787965246638c1a6fd99fb2b6078114 Mon Sep 17 00:00:00 2001 From: Yuly Novikov Date: Tue, 20 Nov 2012 02:04:57 +0000 Subject: 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 Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer --- diff -urN xorg-server-1.13.0.orig/dix/getevents.c xorg-server-1.13.0/dix/getevents.c --- xorg-server-1.13.0.orig/dix/getevents.c 2013-01-25 11:54:23.504267183 +0100 +++ xorg-server-1.13.0/dix/getevents.c 2013-01-25 11:59:57.982385625 +0100 @@ -1950,32 +1950,27 @@ 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 -urN xorg-server-1.13.0.orig/include/inputstr.h xorg-server-1.13.0/include/inputstr.h --- xorg-server-1.13.0.orig/include/inputstr.h 2012-03-22 22:34:02.000000000 +0100 +++ xorg-server-1.13.0/include/inputstr.h 2013-01-25 11:56:56.494818463 +0100 @@ -331,7 +331,7 @@ 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 {