On Mon, Nov 19, 2012 at 09:04:57PM -0500, Yuly Novikov wrote: > DDXTouchPointInfoRec.valuators used to store axis values after transform. > This resulted in Coordinate Transformation Matrix > being applied multiple times to the last coordinates, > in the case when only pressure changes in the last touch event. > > Changed DDXTouchPointInfoRec.valuators to store values before transform. > > Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=49347 > > Signed-off-by: Yuly Novikov <ynovi...@chromium.org> > ---
merged, thanks Cheers, Peter > dix/getevents.c | 22 +++++++++------------- > include/inputstr.h | 2 +- > 2 files changed, 10 insertions(+), 14 deletions(-) > > diff --git a/dix/getevents.c b/dix/getevents.c > index 2a686e8..b52efc5 100644 > --- a/dix/getevents.c > +++ b/dix/getevents.c > @@ -1940,32 +1940,28 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr > dev, uint32_t ddx_touchid, > default: > return 0; > } > - if (t->mode == XIDirectTouch && !(flags & TOUCH_CLIENT_ID)) { > - if (!valuator_mask_isset(&mask, 0)) > - valuator_mask_set_double(&mask, 0, > - valuator_mask_get_double(touchpoint.ti-> > - valuators, 0)); > - if (!valuator_mask_isset(&mask, 1)) > - valuator_mask_set_double(&mask, 1, > - valuator_mask_get_double(touchpoint.ti-> > - valuators, 1)); > - } > > /* Get our screen event co-ordinates (root_x/root_y/event_x/event_y): > * these come from the touchpoint in Absolute mode, or the sprite in > * Relative. */ > if (t->mode == XIDirectTouch) { > - transformAbsolute(dev, &mask); > - > if (!(flags & TOUCH_CLIENT_ID)) { > - for (i = 0; i < valuator_mask_size(&mask); i++) { > + for (i = 0; i < max(valuator_mask_size(&mask), 2); i++) { > double val; > > if (valuator_mask_fetch_double(&mask, i, &val)) > valuator_mask_set_double(touchpoint.ti->valuators, i, > val); > + /* If the device doesn't post new X and Y axis values, > + * use the last values posted. > + */ > + else if (i < 2 && > + valuator_mask_fetch_double(touchpoint.ti->valuators, i, > + &val)) > + valuator_mask_set_double(&mask, i, val); > } > } > > + transformAbsolute(dev, &mask); > clipAbsolute(dev, &mask); > } > else { > diff --git a/include/inputstr.h b/include/inputstr.h > index 5a38924..bb0a779 100644 > --- a/include/inputstr.h > +++ b/include/inputstr.h > @@ -331,7 +331,7 @@ typedef struct _DDXTouchPointInfo { > uint32_t ddx_id; /* touch ID given by the DDX */ > Bool emulate_pointer; > > - ValuatorMask *valuators; /* last recorded axis values */ > + ValuatorMask *valuators; /* last axis values as posted, pre-transform > */ > } DDXTouchPointInfoRec; > > typedef struct _TouchClassRec { > -- > 1.7.7.3 > _______________________________________________ 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