On 05/14/2012 10:23 PM, Peter Hutterer wrote: > last.valuators contains the transformed valuators of the device. If the > device submits events with x/y missing, we need to get that from > last.valuators and undo the transformation to that axis. > > X.Org Bug 49347 <http://bugs.freedesktop.org/show_bug.cgi?id=49347> > > Signed-off-by: Peter Hutterer <[email protected]> > --- > Changes to v1: > - exit early if neither x or y are set > > dix/getevents.c | 25 +++++++++++++++++++++---- > 1 file changed, 21 insertions(+), 4 deletions(-) > > diff --git a/dix/getevents.c b/dix/getevents.c > index c960d44..ae4112f 100644 > --- a/dix/getevents.c > +++ b/dix/getevents.c > @@ -1166,16 +1166,33 @@ static void > transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask) > { > double x, y, ox, oy; > + int has_x, has_y; > + > + has_x = valuator_mask_fetch_double(mask, 0, &ox); > + has_y = valuator_mask_fetch_double(mask, 1, &oy); > + > + if (!has_x && !has_y) > + return; > + > + if (!has_x || !has_y) { > + struct pixman_f_transform invert; > + > + /* undo transformation from last event */ > + ox = dev->last.valuators[0]; > + oy = dev->last.valuators[1]; > + > + pixman_f_transform_invert(&invert, &dev->transform); > + transform(&invert, &ox, &oy); > + > + x = ox; > + y = oy; > + } > > if (valuator_mask_isset(mask, 0)) > ox = x = valuator_mask_get_double(mask, 0); > - else > - ox = x = dev->last.valuators[0]; > > if (valuator_mask_isset(mask, 1)) > oy = y = valuator_mask_get_double(mask, 1); > - else > - oy = y = dev->last.valuators[1]; > > transform(&dev->transform, &x, &y); >
Looks good! Let's hope we don't hit any algorithmic instability with the transformation inversion... Reviewed-by: Chase Douglas <[email protected]> _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
