[PATCH v2 libinput 05/10] filter: adjust acceleration curve depending on speed
Hans de Goede
hdegoede at redhat.com
Mon Sep 22 00:28:07 PDT 2014
Hi,
On 09/22/2014 02:57 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>
Looks good:
Reviewed-by: Hans de Goede <hdegoede at redhat.com>
Regards,
Hans
> ---
> Changes to v1:
> - change accel adjustments to use the defaults at speed 0
>
> src/filter.c | 19 +++++++++++++++++--
> 1 file changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/src/filter.c b/src/filter.c
> index 327dbce..defbcae 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/6.0;
> +
> + /* adjust max accel factor */
> + accel_filter->accel = DEFAULT_ACCELERATION + speed;
> +
> + /* higher speed -> faster to reach max */
> + accel_filter->incline = DEFAULT_INCLINE + speed/2.0;
> +
> 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);
> }
>
More information about the wayland-devel
mailing list