[PATCH v2] dix: undo transformation for missing valuators (#49347)
Chase Douglas
chase.douglas at canonical.com
Tue May 15 08:43:14 PDT 2012
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 <peter.hutterer at who-t.net>
> ---
> 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 <chase.douglas at canonical.com>
More information about the xorg-devel
mailing list