[PATCH 1/2] dix: Add unaccelerated valuators to the ValuatorMask
Hans de Goede
hdegoede at redhat.com
Mon May 4 23:35:48 PDT 2015
Hi Peter,
On 05-05-15 07:22, 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>
The entire set looks good to me, and seems to be a clean solution to the
problem:
Reviewed-by: Hans de Goede <hdegoede at redhat.com>
Regards,
Hans
> ---
> 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