[PATCH libinput 05/10] filter: adjust acceleration curve depending on speed

Hans de Goede hdegoede at redhat.com
Fri Sep 19 00:14:55 PDT 2014


Hi,

On 09/19/2014 07:44 AM, Peter Hutterer wrote:
> The acceleration curve consists of four parts, in ascii-art like this:
>         _____________
>        /
>   ____/
>  /
> /
> 
> where the x axis is the speed, y is the acceleration factor.
> The first plateau is at the acceleration factor 1 (i.e. unaccelerated
> movement), the second plateau is at the max acceleration factor. The threshold
> in the code defines where and how long the plateau is.
> 
> This patch adjusts the curve based on a [-1, 1] range. For anything below 0,
> the plateau is longer (i.e. accel kicks in at a higher speed), the second
> incline is flatter (i.e. accel kicks in slower) and the max accel factor is
> lower (i.e. maximum speed is slower). For anything above 0, the inverse is
> true, acceleration kicks in earlier, harder and is faster in general. So the
> default/min/max curves overlaid look something like this:
>        ________ max
>       | _______ default
>      | /  _____ min
>   ___|/_/
>  /
> /
> 
> Note that there's a limit to what ascii art can do...
> 
> Note that there are additional tweaks we can introduce later, such as
> decreaseing the unaccelerated speed of the device (i.e. lowering the first
> plateau).
> 
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

Patches 1-4 looks good, and are:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Comments on this one inline.


> ---
>  src/filter.c | 19 +++++++++++++++++--
>  1 file changed, 17 insertions(+), 2 deletions(-)
> 
> diff --git a/src/filter.c b/src/filter.c
> index 327dbce..da5c232 100644
> --- a/src/filter.c
> +++ b/src/filter.c
> @@ -69,6 +69,7 @@ filter_get_speed(struct motion_filter *filter)
>  
>  #define DEFAULT_THRESHOLD 0.4			/* in units/ms */
>  #define DEFAULT_ACCELERATION 2.0		/* unitless factor */
> +#define DEFAULT_INCLINE 1.1			/* unitless factor */
>  
>  /*
>   * Pointer acceleration filter constants
> @@ -101,6 +102,7 @@ struct pointer_accelerator {
>  
>  	double threshold;	/* units/ms */
>  	double accel;		/* unitless factor */
> +	double incline;		/* incline of the function */
>  };
>  
>  static void
> @@ -255,10 +257,21 @@ static bool
>  accelerator_set_speed(struct motion_filter *filter,
>  		      double speed)
>  {
> +	struct pointer_accelerator *accel_filter =
> +		(struct pointer_accelerator *)filter;
> +
>  	assert(speed >= -1.0 && speed <= 1.0);
>  
> +	/* delay when accel kicks in */
> +	accel_filter->threshold = DEFAULT_THRESHOLD - (speed - 1)/6.0;
> +

Hmm, AFAIK a set_speed with 0 should lead to the defaults being set,
and that is not the case for the threshold here. I think you want
to use just speed rather then (speed - 1).

Also in the future in cases where you do use 1, and it is a double can
you please write 1.0 ?

> +	/* adjust max accel factor */
> +	accel_filter->accel = DEFAULT_ACCELERATION + speed;
> +
> +	/* higher speed -> faster to reach max */
> +	accel_filter->incline = DEFAULT_INCLINE + (speed + 1)/2.0;

Same comment as for the threshold, I think you want to drop the
+ 1.

> +
>  	filter->speed = speed;
> -
>  	return true;
>  }
>  
> @@ -290,6 +303,7 @@ create_pointer_accelator_filter(accel_profile_func_t profile)
>  
>  	filter->threshold = DEFAULT_THRESHOLD;
>  	filter->accel = DEFAULT_ACCELERATION;
> +	filter->incline = DEFAULT_INCLINE;
>  
>  	return &filter->base;
>  }
> @@ -314,9 +328,10 @@ pointer_accel_profile_linear(struct motion_filter *filter,
>  	double s1, s2;
>  	const double max_accel = accel_filter->accel; /* unitless factor */
>  	const double threshold = accel_filter->threshold; /* units/ms */
> +	const double incline = accel_filter->incline;
>  
>  	s1 = min(1, speed_in * 5);
> -	s2 = 1 + (speed_in - threshold) * 1.1;
> +	s2 = 1 + (speed_in - threshold) * incline;
>  
>  	return min(max_accel, s2 > 1 ? s2 : s1);
>  }
> 

Otherwise looks good.

Regards,

Hans


More information about the wayland-devel mailing list