diff options
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.patch | 106 |
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. */ |