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

Simon Thum simon.thum at gmx.de
Tue May 5 10:12:32 PDT 2015


Hi Peter,

This:

 > +Bool
 > +valuator_mask_has_accelerated(const ValuatorMask *mask)
 > +{
 > +    return mask->has_unacel;
 > +}

looks quite quirky, in semantics and spelling.

But I have a much larger issue that irritates me. The whole ptraccel 
shebang was moved to libinput:

http://cgit.freedesktop.org/wayland/libinput/commit/src/filter.c?id=bb25b2ad297891430606c367bfabc5a032f0359d

It might be just bad style arising from little time and a general 
getting-things-done approach to just say that "ideas and magic numbers" 
are from xserver when batches of verbatim code are involved.

I, personally, might just prefer proper attribution but the MIT licence 
is quite clear that permission is granted "provided that the above 
copyright notice appear in all copies and that both that copyright 
notice and this permission notice appear in supporting documentation."

Peter, I don't now you as someone who does not acknowledge other's work 
and I don't think Jonas is of malicious intent. Let's just fix this please.

Also, it would be nice if libinput fixes could be backported, if only by 
dropping me a note that stuff like

http://cgit.freedesktop.org/wayland/libinput/commit/src/filter.c?id=6e8f5f28e230f849f77dd3381cf21f76c080b261

exists. Yes I haven't been active, but that doesn't mean I don't care.

Cheers,

Simon

On 05/05/2015 07:22 AM, 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>
> ---
>   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);
>


More information about the xorg-devel mailing list