summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'x11-base/xorg-server/files/xorg-server-1.10.4-r2-fix_masked_transformed_valuators.patch')
-rw-r--r--x11-base/xorg-server/files/xorg-server-1.10.4-r2-fix_masked_transformed_valuators.patch106
1 files changed, 106 insertions, 0 deletions
diff --git a/x11-base/xorg-server/files/xorg-server-1.10.4-r2-fix_masked_transformed_valuators.patch b/x11-base/xorg-server/files/xorg-server-1.10.4-r2-fix_masked_transformed_valuators.patch
new file mode 100644
index 0000000..31813aa
--- /dev/null
+++ b/x11-base/xorg-server/files/xorg-server-1.10.4-r2-fix_masked_transformed_valuators.patch
@@ -0,0 +1,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. */