[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freedesktop-xorg-devel
Subject:    [PATCH 2/3] dix: drop x/y back into the right valuators after
From:       Peter Hutterer <peter.hutterer () who-t ! net>
Date:       2011-05-31 3:57:46
Message-ID: 1306814267-23972-2-git-send-email-peter.hutterer () who-t ! net
[Download RAW message or body]

If the matrix is used for rotation, the coordinates affected may change.
e.g. a valuator mask of (x, nil) becomes [x, lasty] and is rotated to
[lasty, x]. Since the second value was unset, we would not drop x back into
the mask, resulting in a loss of movement.

Thus, drop any value that changed after applying the matrix into the
valuators. Thus, the example above becomes
(x, nil) → [x, lasty] → [lasty, x] → (lasty, x)

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
---
 dix/getevents.c |   15 ++++++++-------
 1 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/dix/getevents.c b/dix/getevents.c
index 6dcee3e..1352a81 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -1069,18 +1069,19 @@ transform(struct pixman_f_transform *m, int *x, int *y)
 static void
 transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask)
 {
-    int x, y;
+    int x, y, ox, oy;
 
-    x = valuator_mask_isset(mask, 0) ? valuator_mask_get(mask, 0) :
-                                       dev->last.valuators[0];
-    y = valuator_mask_isset(mask, 1) ? valuator_mask_get(mask, 1) :
-                                       dev->last.valuators[1];
+    ox = x = valuator_mask_isset(mask, 0) ? valuator_mask_get(mask, 0) :
+                                            dev->last.valuators[0];
+    oy = y = valuator_mask_isset(mask, 1) ? valuator_mask_get(mask, 1) :
+                                            dev->last.valuators[1];
 
     transform(&dev->transform, &x, &y);
 
-    if (valuator_mask_isset(mask, 0))
+    if (valuator_mask_isset(mask, 0) || ox != x)
         valuator_mask_set(mask, 0, x);
-    if (valuator_mask_isset(mask, 1))
+
+    if (valuator_mask_isset(mask, 1) || oy != y)
         valuator_mask_set(mask, 1, y);
 }
 
-- 
1.7.5.1

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic