summaryrefslogtreecommitdiff
blob: 31813aa32bbb2b5162e7c5aa428807dd4f1c6477 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
We must store two sets of the X and Y valuator values in the server: both the
last untransformed and the last transformed values. We need the last
untransformed values so we can correctly transform new values, and we need the
last transformed values to know when to set the valuator in the event mask. This
patch ensures the correct handling of valuator values when an input coordinate
transformation matrix with rotation is applied.

Index: xorg-server/dix/getevents.c
===================================================================
--- xorg-server.orig/dix/getevents.c	2011-08-24 12:56:49.855650623 +0300
+++ xorg-server/dix/getevents.c	2011-08-24 12:57:09.015650896 +0300
@@ -1185,15 +1185,29 @@
             }
         }
 
-        x = (valuator_mask_isset(&mask, 0) ? valuator_mask_get(&mask, 0) :
-             pDev->last.valuators[0]);
-        y = (valuator_mask_isset(&mask, 1) ? valuator_mask_get(&mask, 1) :
-             pDev->last.valuators[1]);
-        transformAbsolute(pDev, &mask, &x, &y);
         if (valuator_mask_isset(&mask, 0))
-            valuator_mask_set(&mask, 0, x);
+        {
+            x = valuator_mask_get(&mask, 0);
+            pDev->last.untransformed_x = x;
+        } else
+            x = pDev->last.untransformed_x;
         if (valuator_mask_isset(&mask, 1))
+        {
+            y = valuator_mask_get(&mask, 1);
+            pDev->last.untransformed_y = y;
+        } else
+            y = pDev->last.untransformed_y;
+
+        transformAbsolute(pDev, &mask, &x, &y);
+
+        if (x != pDev->last.valuators[0])
+            valuator_mask_set(&mask, 0, x);
+        else
+            valuator_mask_unset(&mask, 0);
+        if (y != pDev->last.valuators[1])
             valuator_mask_set(&mask, 1, y);
+        else
+            valuator_mask_unset(&mask, 1);
 
         moveAbsolute(pDev, &x, &y, &mask);
     } else {
@@ -1402,22 +1416,27 @@
      * Relative. */
     if (t->mode == XIDirectTouch) {
         if (valuator_mask_isset(&mask, t->x_axis))
+        {
             x = valuator_mask_get(&mask, t->x_axis);
-        else
-            x = ti->valuators[t->x_axis];
-        x = rescaleValuatorAxis(x, 0.0, &x_frac,
-                                (AxisInfoPtr)(t->axes + t->x_axis),
-                                NULL, scr->width);
+            ti->untransformed_x = x;
+        } else
+            x = ti->untransformed_x;
 
         if (valuator_mask_isset(&mask, t->y_axis))
+        {
             y = valuator_mask_get(&mask, t->y_axis);
-        else
-            y = ti->valuators[t->y_axis];
+            ti->untransformed_y = y;
+        } else
+            y = ti->untransformed_y;
+
+        transformAbsolute(pDev, &mask, &x, &y);
+
+        x = rescaleValuatorAxis(x, 0.0, &x_frac,
+                                (AxisInfoPtr)(t->axes + t->x_axis),
+                                NULL, scr->width);
         y = rescaleValuatorAxis(y, 0.0, &y_frac,
                                 (AxisInfoPtr)(t->axes + t->y_axis),
                                 NULL, scr->height);
-
-        transformAbsolute(pDev, &mask, &x, &y);
     }
     else {
         x = pDev->spriteInfo->sprite->hotPhys.x;
Index: xorg-server/include/inputstr.h
===================================================================
--- xorg-server.orig/include/inputstr.h	2011-08-24 12:56:49.865650624 +0300
+++ xorg-server/include/inputstr.h	2011-08-24 12:56:49.905650624 +0300
@@ -335,6 +335,8 @@
     unsigned int history_size;      /* Size of history ring buffer */
     InternalEvent *first_history;   /* Pointer to first event in history */
     InternalEvent *next_history;    /* Pointer to next available event */
+    int         untransformed_x;
+    int         untransformed_y;
 } TouchPointInfoRec;
 
 typedef struct _TouchAxisInfo {
@@ -623,6 +625,8 @@
         float           remainder[MAX_VALUATORS];
         int             numValuators;
         DeviceIntPtr    slave;
+        int             untransformed_x;
+        int             untransformed_y;
     } last;
 
     /* Input device property handling. */