[PATCH 1/2] dix: Add unaccelerated valuators to the ValuatorMask

Peter Hutterer peter.hutterer at who-t.net
Tue May 5 00:55:12 PDT 2015


On Tue, May 05, 2015 at 03:22:07PM +1000, Peter Hutterer wrote:
> Allows a mask to carry both accelerated and unaccelerated motion at the same
> time.
> 
> This is required for xf86-input-libinput where the pointer acceleration
> happens in libinput already, but parts of the server, specifically raw events
> and DGA rely on device-specific unaccelerated data.
> 
> To ease integration add this as a second set to the ValuatorMask rather than
> extending all APIs to carry a second, possibly NULL set of valuators.
> 
> Note that a valuator mask should only be used in either accel/unaccel or
> standard mode at any time. Switching requires either a valuator_mask_zero()
> call or unsetting all valuators one-by-one.
> Trying to mix the two will produce a warning.
> 
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

patchset withdrawn, there's typos in there and it fills the log with false
errors. sorry about that.

Cheers,
   Peter

> ---
>  dix/inpututils.c               | 75 +++++++++++++++++++++++++++++++++++++++---
>  hw/xfree86/common/xf86Module.h |  2 +-
>  include/input.h                | 14 ++++++++
>  include/inpututils.h           |  2 ++
>  4 files changed, 87 insertions(+), 6 deletions(-)
> 
> diff --git a/dix/inpututils.c b/dix/inpututils.c
> index 5c2a32d..c5869ab 100644
> --- a/dix/inpututils.c
> +++ b/dix/inpututils.c
> @@ -505,11 +505,8 @@ valuator_mask_isset(const ValuatorMask *mask, int valuator)
>      return mask->last_bit >= valuator && BitIsOn(mask->mask, valuator);
>  }
>  
> -/**
> - * Set the valuator to the given floating-point data.
> - */
> -void
> -valuator_mask_set_double(ValuatorMask *mask, int valuator, double data)
> +static inline void
> +_valuator_mask_set_double(ValuatorMask *mask, int valuator, double data)
>  {
>      mask->last_bit = max(valuator, mask->last_bit);
>      SetBit(mask->mask, valuator);
> @@ -517,6 +514,17 @@ valuator_mask_set_double(ValuatorMask *mask, int valuator, double data)
>  }
>  
>  /**
> + * Set the valuator to the given floating-point data.
> + */
> +void
> +valuator_mask_set_double(ValuatorMask *mask, int valuator, double data)
> +{
> +    BUG_WARN_MSG(mask->has_unacel,
> +                 "Do not mix valuator types, zero mask first\n");
> +    _valuator_mask_set_double(mask, valuator, data);
> +}
> +
> +/**
>   * Set the valuator to the given integer data.
>   */
>  void
> @@ -594,11 +602,15 @@ valuator_mask_unset(ValuatorMask *mask, int valuator)
>  
>          ClearBit(mask->mask, valuator);
>          mask->valuators[valuator] = 0.0;
> +        mask->unaccelerated[valuator] = 0.0;
>  
>          for (i = 0; i <= mask->last_bit; i++)
>              if (valuator_mask_isset(mask, i))
>                  lastbit = max(lastbit, i);
>          mask->last_bit = lastbit;
> +
> +        if (mask->last_bit == -1)
> +            mask->has_unacel = FALSE;
>      }
>  }
>  
> @@ -611,6 +623,59 @@ valuator_mask_copy(ValuatorMask *dest, const ValuatorMask *src)
>          valuator_mask_zero(dest);
>  }
>  
> +Bool
> +valuator_mask_has_accelerated(const ValuatorMask *mask)
> +{
> +    return mask->has_unacel;
> +}
> +
> +/**
> + * Set both accelerated and unaccelerated value for this mask.
> + */
> +void
> +valuator_mask_set_accelerated(ValuatorMask *mask,
> +                              int valuator,
> +                              double accel,
> +                              double unaccel)
> +{
> +    BUG_WARN_MSG(mask->last_bit != -1 && !mask->has_unacel,
> +                 "Do not mix valuator types, zero mask first\n");
> +    _valuator_mask_set_double(mask, valuator, accel);
> +    mask->has_unacel = TRUE;
> +    mask->unaccelerated[valuator] = unaccel;
> +}
> +
> +double
> +valuator_mask_get_accelerated(const ValuatorMask *mask,
> +                              int valuator)
> +{
> +    return valuator_mask_get_double(mask, valuator);
> +}
> +
> +double
> +valuator_mask_get_unaccelerated(const ValuatorMask *mask,
> +                                int valuator)
> +{
> +    return mask->unaccelerated[valuator];
> +}
> +
> +Bool
> +valuator_mask_fetch_accelerated(const ValuatorMask *mask,
> +                                int valuator,
> +                                double *accel,
> +                                double *unaccel)
> +{
> +    if (valuator_mask_isset(mask, valuator)) {
> +        if (accel)
> +            *accel = valuator_mask_get_accelerated(mask, valuator);
> +        if (unaccel)
> +            *unaccel = valuator_mask_get_unaccelerated(mask, valuator);
> +        return TRUE;
> +    }
> +    else
> +        return FALSE;
> +}
> +
>  int
>  CountBits(const uint8_t * mask, int len)
>  {
> diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
> index 25a8869..66c2bb5 100644
> --- a/hw/xfree86/common/xf86Module.h
> +++ b/hw/xfree86/common/xf86Module.h
> @@ -81,7 +81,7 @@ typedef enum {
>   */
>  #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 4)
>  #define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(19, 0)
> -#define ABI_XINPUT_VERSION	SET_ABI_VERSION(22, 0)
> +#define ABI_XINPUT_VERSION	SET_ABI_VERSION(22, 1)
>  #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(9, 0)
>  #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 6)
>  
> diff --git a/include/input.h b/include/input.h
> index 00a9cbd..480cbd0 100644
> --- a/include/input.h
> +++ b/include/input.h
> @@ -673,6 +673,20 @@ extern _X_EXPORT Bool valuator_mask_fetch(const ValuatorMask *mask,
>  extern _X_EXPORT Bool valuator_mask_fetch_double(const ValuatorMask *mask,
>                                                   int valnum, double *val);
>  
> +extern _X_EXPORT Bool valuator_mask_has_accelerated(const ValuatorMask *mask);
> +extern _X_EXPORT void valuator_mask_set_accelerated(ValuatorMask *mask,
> +                                                           int valuator,
> +                                                           double accel,
> +                                                           double unaccel);
> +extern _X_EXPORT double valuator_mask_get_accelerated(const ValuatorMask *mask,
> +                                                      int valuator);
> +extern _X_EXPORT double valuator_mask_get_unaccelerated(const ValuatorMask *mask,
> +                                                        int valuator);
> +extern _X_EXPORT Bool valuator_mask_fetch_accelerated(const ValuatorMask *mask,
> +                                                      int valuator,
> +                                                      double *accel,
> +                                                      double *unaccel);
> +
>  /* InputOption handling interface */
>  extern _X_EXPORT InputOption *input_option_new(InputOption *list,
>                                                 const char *key,
> diff --git a/include/inpututils.h b/include/inpututils.h
> index 53c96ba..90eafe3 100644
> --- a/include/inpututils.h
> +++ b/include/inpututils.h
> @@ -36,8 +36,10 @@ extern Mask event_filters[MAXDEVICES][MAXEVENTS];
>  
>  struct _ValuatorMask {
>      int8_t last_bit;            /* highest bit set in mask */
> +    int8_t has_unacel;
>      uint8_t mask[(MAX_VALUATORS + 7) / 8];
>      double valuators[MAX_VALUATORS];    /* valuator data */
> +    double unaccelerated[MAX_VALUATORS];    /* valuator data */
>  };
>  
>  extern void verify_internal_event(const InternalEvent *ev);
> -- 
> 2.3.5
> 


More information about the xorg-devel mailing list