[PATCH] input: fix mouse wheel support for DGA clients

Peter Hutterer peter.hutterer at who-t.net
Mon May 21 00:05:45 PDT 2012


On Mon, May 21, 2012 at 01:16:40AM +0200, Marcin Slusarz wrote:
> xf86-input-evdev (since "smooth scrolling" support was added) can send mouse
> motion and wheel events in one batch, so we need to handle it properly.
> Otherwise mouse wheel events which came with motion events are lost
> and separate mouse wheel events are handled through non-DGA path.
> 
> Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com>
> ---
>  hw/xfree86/common/xf86Xinput.c |   77 ++++++++++++++++++++++++++++++++--------
>  1 files changed, 62 insertions(+), 15 deletions(-)
> 
> diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
> index d246d2a..bf615ad 100644
> --- a/hw/xfree86/common/xf86Xinput.c
> +++ b/hw/xfree86/common/xf86Xinput.c
> @@ -1059,24 +1059,16 @@ xf86PostMotionEventP(DeviceIntPtr device,
>      xf86PostMotionEventM(device, is_absolute, &mask);
>  }
>  
> -void
> -xf86PostMotionEventM(DeviceIntPtr device,
> -                     int is_absolute, const ValuatorMask *mask)
> +#if XFreeXDGA
> +static int xf86CheckMotionEvent4DGA(DeviceIntPtr device, int is_absolute,
> +                                    const ValuatorMask *mask)
>  {

put the #if inside here (afer stolen = 0), so we don't have two declarations
of the same function.

(also, general note, we require 4-space indentation now, no tabs)

> -    int flags = 0;
> -
> -    if (valuator_mask_num_valuators(mask) > 0) {
> -        if (is_absolute)
> -            flags = POINTER_ABSOLUTE;
> -        else
> -            flags = POINTER_RELATIVE | POINTER_ACCELERATE;
> -    }
> +    int stolen = 0;
>  
> -#if XFreeXDGA
>      /* The evdev driver may not always send all axes across. */
>      if (valuator_mask_isset(mask, 0) || valuator_mask_isset(mask, 1))
>          if (miPointerGetScreen(device)) {
> -            int index = miPointerGetScreen(device)->myNum;
> +            int idx = miPointerGetScreen(device)->myNum;

any particular reason you changed this name?

>              int dx = 0, dy = 0;
>  
>              if (valuator_mask_isset(mask, 0)) {
> @@ -1091,11 +1083,66 @@ xf86PostMotionEventM(DeviceIntPtr device,
>                      dy -= device->last.valuators[1];
>              }
>  
> -            if (DGAStealMotionEvent(device, index, dx, dy))
> -                return;
> +            if (DGAStealMotionEvent(device, idx, dx, dy))
> +                stolen = 1;
> +        }
> +
> +    if (valuator_mask_isset(mask, 2))

please wrap this in {} as well

> +        if (miPointerGetScreen(device)) {
> +            int idx = miPointerGetScreen(device)->myNum;
> +
> +            if (valuator_mask_get(mask, 2) > 0) {
> +		if (DGAStealButtonEvent(device, idx, 4, 1) &&
> +			DGAStealButtonEvent(device, idx, 4, 0))
> +		    stolen = 1;
> +            } else {
> +		if (DGAStealButtonEvent(device, idx, 5, 1) &&
> +			DGAStealButtonEvent(device, idx, 5, 0))
> +		    stolen = 1;
> +            }
> +        }
> +
> +    if (valuator_mask_isset(mask, 3))
> +        if (miPointerGetScreen(device)) {
> +            int idx = miPointerGetScreen(device)->myNum;
> +
> +            if (valuator_mask_get(mask, 3) > 0) {
> +		if (DGAStealButtonEvent(device, idx, 7, 1) &&
> +			DGAStealButtonEvent(device, idx, 7, 0))
> +		    stolen = 1;
> +            } else {
> +		if (DGAStealButtonEvent(device, idx, 6, 1) &&
> +			DGAStealButtonEvent(device, idx, 6, 0))
> +		    stolen = 1;
> +            }
>          }

not quite correct, we can't guarantee that valuators 2/3 are the scrolling
axes on every device. you need to check if the
valuator->axes[axis].scroll.type is something other than SCROLL_TYPE_NONE.
emulate_scroll_button_events in dix/getevents.c is the blueprint here,
should be easy enough to follow (or possibly re-use)

Cheers,
  Peter

> +
> +    return stolen;
> +}
> +#else
> +static int xf86CheckMotionEvent4DGA(DeviceIntPtr device, int is_absolute,
> +                                    const ValuatorMask *mask)
> +{
> +    return 0;
> +}
>  #endif
>  
> +void
> +xf86PostMotionEventM(DeviceIntPtr device,
> +                     int is_absolute, const ValuatorMask *mask)
> +{
> +    int flags = 0;
> +
> +    if (valuator_mask_num_valuators(mask) > 0) {
> +        if (is_absolute)
> +            flags = POINTER_ABSOLUTE;
> +        else
> +            flags = POINTER_RELATIVE | POINTER_ACCELERATE;
> +    }
> +
> +    if (xf86CheckMotionEvent4DGA(device, is_absolute, mask))
> +	return;
> +
>      QueuePointerEvents(device, MotionNotify, 0, flags, mask);
>  }
>  
> -- 
> 1.7.8.6
> 


More information about the xorg-devel mailing list