[PATCH libinput 3/3] filter: move the pointer acceleration profiles back to units/ms

Peter Hutterer peter.hutterer at who-t.net
Thu Jul 30 23:43:11 PDT 2015


On Fri, Jul 31, 2015 at 02:37:52PM +0800, Jonas Ådahl wrote:
> On Fri, Jul 31, 2015 at 04:19:03PM +1000, Peter Hutterer wrote:
> > There is no need here to use µs since we're just handling speeds/thresholds,
> > not actual events where a ms granularity can be too high.
> > 
> > Moving back to ms lets us drop a bunch of zeroes that clutter up the code, and
> > since the acceleration functions are a bit magic anyway, having the various
> > 1000.0 factors in there makes it even less obvious.
> > 
> > Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> > ---
> >  src/filter.c           | 38 +++++++++++++++++++-------------------
> >  tools/ptraccel-debug.c |  4 ++--
> >  2 files changed, 21 insertions(+), 21 deletions(-)
> > 
> > diff --git a/src/filter.c b/src/filter.c
> > index 54ae397..f5a3748 100644
> > --- a/src/filter.c
> > +++ b/src/filter.c
> > @@ -77,7 +77,7 @@ filter_get_speed(struct motion_filter *filter)
> >   * Default parameters for pointer acceleration profiles.
> >   */
> >  
> > -#define DEFAULT_THRESHOLD 0.0004		/* in units/us */
> > +#define DEFAULT_THRESHOLD 0.4			/* in units/ms */
> >  #define DEFAULT_ACCELERATION 2.0		/* unitless factor */
> >  #define DEFAULT_INCLINE 1.1			/* unitless factor */
> >  
> > @@ -220,7 +220,7 @@ calculate_velocity(struct pointer_accelerator *accel, uint64_t time)
> >  		}
> >  	}
> >  
> > -	return result; /* units/us */
> > +	return result * 1000; /* units/ms */
> 
> Did you consider changing velocity back to units/ms everywhere, i.e.
> calculate_tracker_velocity? Doing it here would mean "velocity" means
> different depending on where in the code it is.

yeah, good point, I'll fix that up.

> Also, I wonder how I could have missed 2/3. Sorry about that.

np, I didnt' see it either until I modified it for other reasons. we should
have a test for that but...

> With the above comment in mind, these three are still Reviewed-by: Jonas
> Ådahl <jadahl at gmail.com>

thanks for the reviews.

Cheers,
   Peter

> >  }
> >  
> >  static double
> > @@ -256,11 +256,11 @@ calculate_acceleration(struct pointer_accelerator *accel,
> >  static struct normalized_coords
> >  accelerator_filter(struct motion_filter *filter,
> >  		   const struct normalized_coords *unaccelerated,
> > -		   void *data, uint64_t time)
> > +		   void *data, uint64_t time /* in us */)
> >  {
> >  	struct pointer_accelerator *accel =
> >  		(struct pointer_accelerator *) filter;
> > -	double velocity; /* units/us */
> > +	double velocity; /* units/ms */
> >  	double accel_value; /* unitless factor */
> >  	struct normalized_coords accelerated;
> >  	struct normalized_coords unnormalized;
> > @@ -397,23 +397,23 @@ create_pointer_accelerator_filter(accel_profile_func_t profile,
> >  double
> >  pointer_accel_profile_linear_low_dpi(struct motion_filter *filter,
> >  				     void *data,
> > -				     double speed_in, /* in device units (units/us) */
> > -				     uint64_t time)
> > +				     double speed_in, /* in device units (units/ms) */
> > +				     uint64_t time /* in us */)
> >  {
> >  	struct pointer_accelerator *accel_filter =
> >  		(struct pointer_accelerator *)filter;
> >  
> >  	double s1, s2;
> >  	double max_accel = accel_filter->accel; /* unitless factor */
> > -	const double threshold = accel_filter->threshold; /* units/us */
> > +	const double threshold = accel_filter->threshold; /* units/ms */
> >  	const double incline = accel_filter->incline;
> >  	double factor;
> >  	double dpi_factor = accel_filter->dpi_factor;
> >  
> >  	max_accel /= dpi_factor;
> >  
> > -	s1 = min(1, 0.3 + speed_in * 10000.0);
> > -	s2 = 1 + (speed_in * 1000.0 - threshold * dpi_factor * 1000.0) * incline;
> > +	s1 = min(1, 0.3 + speed_in * 10.0);
> > +	s2 = 1 + (speed_in - threshold * dpi_factor) * incline;
> >  
> >  	factor = min(max_accel, s2 > 1 ? s2 : s1);
> >  
> > @@ -424,19 +424,19 @@ double
> >  pointer_accel_profile_linear(struct motion_filter *filter,
> >  			     void *data,
> >  			     double speed_in, /* 1000-dpi normalized */
> > -			     uint64_t time)
> > +			     uint64_t time /* in us */)
> >  {
> >  	struct pointer_accelerator *accel_filter =
> >  		(struct pointer_accelerator *)filter;
> >  
> >  	double s1, s2;
> >  	const double max_accel = accel_filter->accel; /* unitless factor */
> > -	const double threshold = accel_filter->threshold; /* units/us */
> > +	const double threshold = accel_filter->threshold; /* units/ms */
> >  	const double incline = accel_filter->incline;
> >  	double factor;
> >  
> > -	s1 = min(1, 0.3 + speed_in * 10 * 1000.0);
> > -	s2 = 1 + (speed_in * 1000.0 - threshold * 1000.0) * incline;
> > +	s1 = min(1, 0.3 + speed_in * 10);
> > +	s2 = 1 + (speed_in - threshold) * incline;
> >  
> >  	factor =  min(max_accel, s2 > 1 ? s2 : s1);
> >  
> > @@ -446,8 +446,8 @@ pointer_accel_profile_linear(struct motion_filter *filter,
> >  double
> >  touchpad_accel_profile_linear(struct motion_filter *filter,
> >                                void *data,
> > -                              double speed_in,
> > -                              uint64_t time)
> > +			      double speed_in,
> > +			      uint64_t time /* in us */)
> >  {
> >  	/* Once normalized, touchpads see the same
> >  	   acceleration as mice. that is technically correct but
> > @@ -468,7 +468,7 @@ double
> >  touchpad_lenovo_x230_accel_profile(struct motion_filter *filter,
> >  				      void *data,
> >  				      double speed_in,
> > -				      uint64_t time)
> > +				      uint64_t time /* in us */)
> >  {
> >  	/* Keep the magic factor from touchpad_accel_profile_linear.  */
> >  	const double TP_MAGIC_SLOWDOWN = 0.4;
> > @@ -488,13 +488,13 @@ touchpad_lenovo_x230_accel_profile(struct motion_filter *filter,
> >  	const double max_accel = accel_filter->accel *
> >  				  TP_MAGIC_LOW_RES_FACTOR; /* unitless factor */
> >  	const double threshold = accel_filter->threshold /
> > -				  TP_MAGIC_LOW_RES_FACTOR; /* units/us */
> > +				  TP_MAGIC_LOW_RES_FACTOR; /* units/ms */
> >  	const double incline = accel_filter->incline * TP_MAGIC_LOW_RES_FACTOR;
> >  
> >  	speed_in *= TP_MAGIC_SLOWDOWN / TP_MAGIC_LOW_RES_FACTOR;
> >  
> > -	s1 = min(1, speed_in * 5 * 1000.0);
> > -	s2 = 1 + (speed_in  * 1000.0 - threshold * 1000.0) * incline;
> > +	s1 = min(1, speed_in * 5);
> > +	s2 = 1 + (speed_in - threshold) * incline;
> >  
> >  	speed_out = min(max_accel, s2 > 1 ? s2 : s1);
> >  
> > diff --git a/tools/ptraccel-debug.c b/tools/ptraccel-debug.c
> > index b0867db..1496763 100644
> > --- a/tools/ptraccel-debug.c
> > +++ b/tools/ptraccel-debug.c
> > @@ -147,12 +147,12 @@ print_accel_func(struct motion_filter *filter)
> >  	printf("# set ylabel \"raw accel factor\"\n");
> >  	printf("# set style data lines\n");
> >  	printf("# plot \"gnuplot.data\" using 1:2\n");
> > -	for (vel = 0.0; vel < 0.003; vel += 0.0000001) {
> > +	for (vel = 0.0; vel < 3.0; vel += .0001) {
> >  		double result = pointer_accel_profile_linear(filter,
> >                                                               NULL,
> >                                                               vel,
> >                                                               0 /* time */);
> > -		printf("%.8f\t%.4f\n", vel, result);
> > +		printf("%.4f\t%.4f\n", vel, result);
> >  	}
> >  }
> >  
> > -- 
> > 2.4.3
> > 
> > _______________________________________________
> > wayland-devel mailing list
> > wayland-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list