[PATCH] dix: only transform valuators when we need them.

Chase Douglas chase.douglas at canonical.com
Mon Apr 25 09:58:17 PDT 2011


On 04/21/2011 03:35 AM, Peter Hutterer wrote:
> Unconditionally drop the valuators back into the mask when they were there
> in the first place. Otherwise, sending identical coordinates from the driver
> on a translated device causes the valuator mask to be alternatively
> overwritten with the translated value or left as-is. This leads to the
> device jumping around between the translated and the original position.
> 
> The same could be achieved with a valuator_mask_unset() combination.
> 
> Testcase:
> xsetwacom set "device name" MapToOutput VGA1
> Then press a button on the device, cursor jumps between the two positions.
> 
> Introduced in 31737fff08ec19b394837341d5e358ec401f5cd8
> 
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
>  dix/getevents.c |    5 +++--
>  1 files changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/dix/getevents.c b/dix/getevents.c
> index 0fa8046..7afd330 100644
> --- a/dix/getevents.c
> +++ b/dix/getevents.c
> @@ -1065,9 +1065,10 @@ transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask)
>  
>      pixman_f_transform_point(&dev->transform, &p);
>  
> -    if (lround(p.v[0]) != dev->last.valuators[0])
> +    if (valuator_mask_isset(mask, 0))
>          valuator_mask_set(mask, 0, lround(p.v[0]));
> -    if (lround(p.v[1]) != dev->last.valuators[1])
> +
> +    if (valuator_mask_isset(mask, 1))
>          valuator_mask_set(mask, 1, lround(p.v[1]));
>  }
>  

Why don't we change this to:

if (lround(p.v[0]) != dev->last.valuators[0])
    valuator_mask_set(mask, 0, lround(p.v[0]));
else
    valuator_mask_unset(mask, 0);

The proposed fix will cause valuators to be sent with repeated values if
they haven't actually changed.

Thanks,

-- Chase


More information about the xorg-devel mailing list