[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xorg-server: Changes to 'ubuntu'



 debian/changelog                                          |    7 
 debian/patches/503_fix_masked_transformed_valuators.patch |  102 ++++++++++++++
 debian/patches/series                                     |    1 
 3 files changed, 110 insertions(+)

New commits:
commit 1af169424506db53d1f4276c54c33d77466bef36
Author: Chase Douglas <chase.douglas@canonical.com>
Date:   Fri Apr 29 11:44:33 2011 -0400

    Fix masked transformed valuator handling (LP: #774938)

diff --git a/debian/changelog b/debian/changelog
index 542e31d..9e457c3 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+xorg-server (2:1.10.1-1ubuntu2) UNRELEASED; urgency=low
+
+  * Fix masked transformed valuator handling (LP: #774938)
+    - Added debian/patches/503_fix_masked_transformed_valuators.patch
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Fri, 29 Apr 2011 11:43:59 -0400
+
 xorg-server (2:1.10.1-1ubuntu1) natty; urgency=low
 
   * Merge from Debian experimental (LP: #757972)
diff --git a/debian/patches/503_fix_masked_transformed_valuators.patch b/debian/patches/503_fix_masked_transformed_valuators.patch
new file mode 100644
index 0000000..1155da8
--- /dev/null
+++ b/debian/patches/503_fix_masked_transformed_valuators.patch
@@ -0,0 +1,102 @@
+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.
+
+--- a/dix/getevents.c
++++ b/dix/getevents.c
+@@ -1177,15 +1177,29 @@ GetPointerEvents(EventList *events, Devi
+             }
+         }
+ 
+-        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 {
+@@ -1392,22 +1406,27 @@ GetTouchEvents(EventList *events, Device
+      * 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;
+--- a/include/inputstr.h
++++ b/include/inputstr.h
+@@ -335,6 +335,8 @@ typedef struct _TouchPointInfo {
+     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 @@ typedef struct _DeviceIntRec {
+         float           remainder[MAX_VALUATORS];
+         int             numValuators;
+         DeviceIntPtr    slave;
++        int             untransformed_x;
++        int             untransformed_y;
+     } last;
+ 
+     /* Input device property handling. */
diff --git a/debian/patches/series b/debian/patches/series
index c866058..44ca5ce 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -35,3 +35,4 @@
 500_xi2.1.patch
 501_xf86CoordinatesToWindow.patch
 502_gestures-extension.patch
+503_fix_masked_transformed_valuators.patch


Reply to: