From e97bc10b8ebb39cbac22c582d4dd61ee9e7168c8 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 9 May 2012 11:30:46 +1000 Subject: [PATCH] dix: undo transformation for missing valuators (#49347) last.valuators contains the transformed valuators of the device. If the device submits events with x/y missing, we need to get that from last.valuators and undo the transformation to that axis. X.Org Bug 49347 Signed-off-by: Peter Hutterer --- dix/getevents.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/dix/getevents.c b/dix/getevents.c index c960d44..d466ebb 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -1167,15 +1167,25 @@ transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask) { double x, y, ox, oy; + if (!valuator_mask_isset(mask, 0) || !valuator_mask_isset(mask, 1)) { + struct pixman_f_transform invert; + + /* undo transformation from last event */ + ox = dev->last.valuators[0]; + oy = dev->last.valuators[1]; + + pixman_f_transform_invert(&invert, &dev->transform); + transform(&invert, &ox, &oy); + + x = ox; + y = oy; + } + if (valuator_mask_isset(mask, 0)) ox = x = valuator_mask_get_double(mask, 0); - else - ox = x = dev->last.valuators[0]; if (valuator_mask_isset(mask, 1)) oy = y = valuator_mask_get_double(mask, 1); - else - oy = y = dev->last.valuators[1]; transform(&dev->transform, &x, &y); -- 1.7.10.1