[PATCH libinput] filter: tweak touchpad acceleration code again

Hans de Goede hdegoede at redhat.com
Fri Feb 24 08:36:26 UTC 2017


Hi,

On 24-02-17 05:37, Peter Hutterer wrote:
> Reduce the magic factor a bit, thus making the pointer more (slow == precise)
> on 'normal movements'. This coincidentally fixes some of the issues with the
> Lenovo T450 and friends because the user's base speed must go up, thus
> papering over the firmware bug that makes the pointer jump at slow movements.
>
> Reduce the threshold speed, so acceleration kicks in a little bit earlier.
> Reduce the threshold range, so at higher speeds accel kicks in earlier but not
> too early.
>
> Flatten the incline, so acceleration applies at a slower rate. This appears to
> fix many of the 'overshoot' problems seen with the current code.
>
> Rework how the accel speed affects the curve and increase the range of the
> accel speed. This now covers a fairly large range from "tarpit" to "tux
> racer". At all speeds bar the super-slow ones it's still relatively easy to
> cross the screen with few motions.
>
> The patch also works the touchpad magic slowdown into the factor applied.
> Since this is a static number now, calculate it once at set-speed and then
> store the result in the filter.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

The code changes look good to me, as for how the new accel feels / works,
I trust you've good reasons for these changes:

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

Regards,

Hans


> ---
> This is the first time I'm quite happy with the touchpad acceleration.
>
>  src/filter.c | 37 ++++++++++++++++++++++++++-----------
>  1 file changed, 26 insertions(+), 11 deletions(-)
>
> diff --git a/src/filter.c b/src/filter.c
> index 7c500f8..4bc6239 100644
> --- a/src/filter.c
> +++ b/src/filter.c
> @@ -40,7 +40,7 @@
>   * technically correct but subjectively wrong, we expect a touchpad to be a
>   * lot slower than a mouse. Apply a magic factor to slow down all movements
>   */
> -#define TP_MAGIC_SLOWDOWN 0.37 /* unitless factor */
> +#define TP_MAGIC_SLOWDOWN 0.29 /* unitless factor */
>
>  /* Convert speed/velocity from units/us to units/ms */
>  static inline double
> @@ -135,10 +135,10 @@ filter_get_type(struct motion_filter *filter)
>  #define DEFAULT_INCLINE 1.1			/* unitless factor */
>
>  /* Touchpad acceleration */
> -#define TOUCHPAD_DEFAULT_THRESHOLD 254		/* mm/s */
> -#define TOUCHPAD_THRESHOLD_RANGE 184		/* mm/s */
> -#define TOUCHPAD_ACCELERATION 9.0		/* unitless factor */
> -#define TOUCHPAD_INCLINE 0.011			/* unitless factor */
> +#define TOUCHPAD_DEFAULT_THRESHOLD 225		/* mm/s */
> +#define TOUCHPAD_THRESHOLD_RANGE 25		/* mm/s */
> +#define TOUCHPAD_ACCELERATION 3.0		/* unitless factor */
> +#define TOUCHPAD_INCLINE 0.008			/* unitless factor */
>
>  /* for the Lenovo x230 custom accel. do not touch */
>  #define X230_THRESHOLD v_ms2us(0.4)		/* in units/us */
> @@ -175,6 +175,7 @@ struct pointer_accelerator {
>  	double threshold;	/* units/us */
>  	double accel;		/* unitless factor */
>  	double incline;		/* incline of the function */
> +	double magic;		/* magic scaling factor */
>
>  	int dpi;
>  };
> @@ -583,9 +584,16 @@ touchpad_accelerator_set_speed(struct motion_filter *filter,
>
>  	/* adjust when accel kicks in */
>  	accel_filter->threshold = TOUCHPAD_DEFAULT_THRESHOLD -
> -		TOUCHPAD_THRESHOLD_RANGE * speed_adjustment;
> +		TOUCHPAD_THRESHOLD_RANGE * (1 + speed_adjustment);
>  	accel_filter->accel = TOUCHPAD_ACCELERATION;
>  	accel_filter->incline = TOUCHPAD_INCLINE;
> +
> +	/* magic is the factor we scale everything by. For unaccelerated
> +	 * motion, this is the baseline factor, for accelerated this scales
> +	 * down the gain we otherwise calculate. 0.28 is a result of
> +	 * trial&error, don't attach any meaning to it. */
> +	accel_filter->magic = TP_MAGIC_SLOWDOWN + 0.28 * speed_adjustment;
> +
>  	filter->speed_adjustment = speed_adjustment;
>
>  	return true;
> @@ -810,7 +818,7 @@ touchpad_accel_profile_linear(struct motion_filter *filter,
>
>  	  accel
>  	 factor
> -	   ^
> +	   ^         ____
>  	   |        /
>  	   |  _____/
>  	   | /
> @@ -823,6 +831,9 @@ touchpad_accel_profile_linear(struct motion_filter *filter,
>  		         x is speed_in
>  			 a is the incline of acceleration
>  			 b is minimum acceleration factor
> +	   The flat bit is the unaccelerated 'baseline speed' where we
> +	   merely slow down the input speed to provide reasonable pointer
> +	   speed.
>
>  	   for speeds up to the lower threshold, we decelerate, down to 30%
>  	   of input speed.
> @@ -836,7 +847,13 @@ touchpad_accel_profile_linear(struct motion_filter *filter,
>  	    has no other intrinsic meaning.
>  	  * 0.3 is chosen simply because it is above the Nyquist frequency
>  	    for subpixel motion within a pixel.
> -	*/
> +
> +	  The acceleration setting [-1.0, 1.0] affects:
> +	   * the baseline speed (higher setting -> faster baseline)
> +	   * the incline's angle (higher setting -> steeper incline)
> +	   * the threshold when accel kicks in (higher setting -> sooner)
> +	 */
> +
>  	if (speed_in < 7.0) {
>  		factor = 0.1 * speed_in + 0.3;
>  	/* up to the threshold, we keep factor 1, i.e. 1:1 movement */
> @@ -860,9 +877,7 @@ touchpad_accel_profile_linear(struct motion_filter *filter,
>  	factor = min(max_accel, factor);
>
>  	/* Scale everything depending on the acceleration set */
> -	factor *= 1 + 0.5 * filter->speed_adjustment;
> -
> -	return factor * TP_MAGIC_SLOWDOWN;
> +	return factor * accel_filter->magic;
>  }
>
>  double
>


More information about the wayland-devel mailing list