* Default parameters for pointer acceleration profiles.
*/
-#define DEFAULT_CONSTANT_ACCELERATION 10.0
-#define DEFAULT_THRESHOLD 4.0
-#define DEFAULT_ACCELERATION 2.0
+#define DEFAULT_THRESHOLD 0.4 /* in units/ms */
+#define DEFAULT_ACCELERATION 2.0 /* unitless factor */
/*
* Pointer acceleration filter constants
*/
-#define MAX_VELOCITY_DIFF 1.0
+#define MAX_VELOCITY_DIFF 1.0 /* units/ms */
#define MOTION_TIMEOUT 300 /* (ms) */
#define NUM_POINTER_TRACKERS 16
struct pointer_tracker {
- double dx;
- double dy;
- uint64_t time;
+ double dx; /* delta to most recent event, in device units */
+ double dy; /* delta to most recent event, in device units */
+ uint64_t time; /* ms */
int dir;
};
accel_profile_func_t profile;
- double velocity;
- double last_velocity;
- int last_dx;
- int last_dy;
+ double velocity; /* units/ms */
+ double last_velocity; /* units/ms */
+ int last_dx; /* device units */
+ int last_dy; /* device units */
struct pointer_tracker *trackers;
int cur_tracker;
dx = tracker->dx;
dy = tracker->dy;
distance = sqrt(dx*dx + dy*dy);
- return distance / (double)(time - tracker->time);
+ return distance / (double)(time - tracker->time); /* units/ms */
}
static double
}
}
- return result;
+ return result; /* units/ms */
}
static double
factor = factor / 6.0;
- return factor;
-}
-
-static double
-soften_delta(double last_delta, double delta)
-{
- if (delta < -1.0 || delta > 1.0) {
- if (delta > last_delta)
- return delta - 0.5;
- else if (delta < last_delta)
- return delta + 0.5;
- }
-
- return delta;
-}
-
-static void
-apply_softening(struct pointer_accelerator *accel,
- struct motion_params *motion)
-{
- motion->dx = soften_delta(accel->last_dx, motion->dx);
- motion->dy = soften_delta(accel->last_dy, motion->dy);
+ return factor; /* unitless factor */
}
static void
{
struct pointer_accelerator *accel =
(struct pointer_accelerator *) filter;
- double velocity;
- double accel_value;
+ double velocity; /* units/ms */
+ double accel_value; /* unitless factor */
feed_trackers(accel, motion->dx, motion->dy, time);
velocity = calculate_velocity(accel, time);
motion->dx = accel_value * motion->dx;
motion->dy = accel_value * motion->dy;
- apply_softening(accel, motion);
-
accel->last_dx = motion->dx;
accel->last_dy = motion->dy;
double
pointer_accel_profile_smooth_simple(struct motion_filter *filter,
void *data,
- double velocity,
+ double velocity, /* units/ms */
uint64_t time)
{
- double threshold = DEFAULT_THRESHOLD;
- double accel = DEFAULT_ACCELERATION;
- double smooth_accel_coefficient;
+ double threshold = DEFAULT_THRESHOLD; /* units/ms */
+ double accel = DEFAULT_ACCELERATION; /* unitless factor */
+ double smooth_accel_coefficient; /* unitless factor */
+ double factor; /* unitless factor */
+
+ if (threshold < 0.1)
+ threshold = 0.1;
+ if (accel < 1.0)
+ accel = 1.0;
+
- velocity *= DEFAULT_CONSTANT_ACCELERATION;
+ if (velocity < (threshold / 2.0))
+ return calc_penumbral_gradient(0.5 + velocity / threshold) * 2.0 - 1.0;
- if (velocity < 1.0)
- return calc_penumbral_gradient(0.5 + velocity * 0.5) * 2.0 - 1.0;
- if (threshold < 1.0)
- threshold = 1.0;
if (velocity <= threshold)
- return 1;
- velocity /= threshold;
- if (velocity >= accel) {
+ return 1.0;
+
+ factor = velocity/threshold;
+ if (factor >= accel)
return accel;
- } else {
- smooth_accel_coefficient =
- calc_penumbral_gradient(velocity / accel);
- return 1.0 + (smooth_accel_coefficient * (accel - 1.0));
- }
+
+ /* factor is between 1.0 and accel, scale this to 0.0 - 1.0 */
+ factor = (factor - 1.0) / (accel - 1.0);
+ smooth_accel_coefficient = calc_penumbral_gradient(factor);
+ return 1.0 + (smooth_accel_coefficient * (accel - 1.0));
}