[PATCH] fixes to pointer acceleration

Peter Hutterer peter.hutterer at who-t.net
Wed May 6 23:15:10 PDT 2009


On Wed, May 06, 2009 at 10:39:16AM +0200, Simon Thum wrote:
> Peter Hutterer wrote:
>> Please add in the commit message why it's ok to remove the "reserved" profile,
>> just in case someone has to figure that out at a later point in time.
> I didn't do that in this patch. Attached patch removes 'reserved' and  
> provides some more reasoning in the commit msg.
>


> From 667b1cf28e38eab6b1b16d3ad2956b5f4d9686e0 Mon Sep 17 00:00:00 2001
> From: Simon Thum <simon.thum at gmx.de>
> Date: Tue, 28 Apr 2009 10:11:32 +0200
> Subject: [PATCH] dix: add 'none' pointer acceleration profile with number -1
> 
> This is a shorthand for disabling acceleration, while retaining the
> possiblity to use constant deceleration. If constant deceleration is
> also unused, it will optimize motion processing.
> 
> Other possiblities to deactivate acceleration were quite hidden,
> and didn't always work as expected. E.g. xset m 1 1 would retain
> adaptive deceleration, while xset m 1 0 would not (in the default
> profile).
> 
> Also removes the 'reserved' profile; it was unused and it's trivial
> to add new ones anyway.
> ---
>  dix/ptrveloc.c     |   36 ++++++++++++++++++++++++++++--------
>  include/ptrveloc.h |    7 +++----
>  2 files changed, 31 insertions(+), 12 deletions(-)
> 
> diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
> index 7fa4200..dd26477 100644
> --- a/dix/ptrveloc.c
> +++ b/dix/ptrveloc.c
> @@ -77,9 +77,12 @@ GetAccelerationProfile(DeviceVelocityPtr s, int profile_num);
>  #endif
>  
>  /********************************
> - *  Init/Uninit etc
> + *  Init/Uninit
>   *******************************/
>  
> +/* some int which is not a profile number */
> +#define PROFILE_UNINITIALIZE (-100)
> +
>  /**
>   * Init struct so it should match the average case
>   */
> @@ -108,7 +111,7 @@ InitVelocityData(DeviceVelocityPtr s)
>  static void
>  FreeVelocityData(DeviceVelocityPtr s){
>      xfree(s->tracker);
> -    SetAccelerationProfile(s, -1);
> +    SetAccelerationProfile(s, PROFILE_UNINITIALIZE);
>  }
>  
>  
> @@ -824,6 +827,16 @@ LinearProfile(
>  }
>  
>  
> +static float
> +NoProfile(
> +    DeviceVelocityPtr pVel,
> +    float velocity,
> +    float threshold,
> +    float acc)
> +{
> +    return 1.0f;
> +}
> +
>  static PointerAccelerationProfileFunc
>  GetAccelerationProfile(
>      DeviceVelocityPtr s,
> @@ -844,8 +857,8 @@ GetAccelerationProfile(
>              return PowerProfile;
>          case AccelProfileLinear:
>              return LinearProfile;
> -        case AccelProfileReserved:
> -            /* reserved for future use, e.g. a user-defined profile */
> +        case AccelProfileNone:
> +            return NoProfile;
>          default:
>              return NULL;
>      }
> @@ -856,8 +869,10 @@ GetAccelerationProfile(
>   * Intended to make profiles exchangeable at runtime.
>   * If you created a profile, give it a number here and in the header to
>   * make it selectable. In case some profile-specific init is needed, here
> - * would be a good place, since FreeVelocityData() also calls this with -1.
> - * returns FALSE (0) if profile number is unavailable.
> + * would be a good place, since FreeVelocityData() also calls this with
> + * PROFILE_UNINITIALIZE.
> + *
> + * returns FALSE if profile number is unavailable, TRUE otherwise.
>   */
>  int
>  SetAccelerationProfile(
> @@ -867,7 +882,7 @@ SetAccelerationProfile(
>      PointerAccelerationProfileFunc profile;
>      profile = GetAccelerationProfile(s, profile_num);
>  
> -    if(profile == NULL && profile_num != -1)
> +    if(profile == NULL && profile_num != PROFILE_UNINITIALIZE)
>  	return FALSE;
>  
>      if(s->profile_private != NULL){
> @@ -955,6 +970,11 @@ acceleratePointerPredictable(
>      if (!num_valuators || !valuators || !velocitydata)
>          return;
>  
> +    if (velocitydata->statistics.profile_number == AccelProfileNone &&
> +	velocitydata->const_acceleration == 1.0f) {
> +	return; /*we're inactive anyway, so skip the whole thing.*/
> +    }
> +
>      if (first_valuator == 0) {
>          dx = valuators[0];
>          px = &valuators[0];
> @@ -988,7 +1008,7 @@ acceleratePointerPredictable(
>                      /* Since it may not be apparent: lrintf() does not offer
>                       * strong statements about rounding; however because we
>                       * process each axis conditionally, there's no danger
> -                     * of a toggling remainder. Its lack of guarantees hopefully
> +                     * of a toggling remainder. Its lack of guarantees likely
>                       * makes it faster on the average target. */
>                      *px = lrintf(tmp);
>                      pDev->last.remainder[0] = tmp - (float)*px;
> diff --git a/include/ptrveloc.h b/include/ptrveloc.h
> index 6ef8c75..83d188c 100644
> --- a/include/ptrveloc.h
> +++ b/include/ptrveloc.h
> @@ -27,9 +27,9 @@
>  
>  #include <input.h> /* DeviceIntPtr */
>  
> -/* constants for acceleration profiles;
> - * see  */
> +/* constants for acceleration profiles */
>  
> +#define AccelProfileNone -1
>  #define AccelProfileClassic  0
>  #define AccelProfileDeviceSpecific 1
>  #define AccelProfilePolynomial 2
> @@ -37,8 +37,7 @@
>  #define AccelProfileSimple 4
>  #define AccelProfilePower 5
>  #define AccelProfileLinear 6
> -#define AccelProfileReserved 7
> -#define AccelProfileLAST AccelProfileReserved
> +#define AccelProfileLAST AccelProfileLinear
>  
>  /* fwd */
>  struct _DeviceVelocityRec;
> -- 
> 1.6.0.6

thanks, merged.

Cheers,
  Peter


More information about the xorg-devel mailing list