[PATCH libinput 04/23] filter: move the smoothing values to the trackers
Peter Hutterer
peter.hutterer at who-t.net
Thu Apr 12 06:34:30 UTC 2018
This way we can pass them around easier without needing the whole
pointer_accelerator struct (which in theory is device-type specific). The
values relate to the calculation of the delta between trackers anyway, so
logically this is where they belong.
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
src/filter-private.h | 8 ++++++++
src/filter.c | 46 +++++++++++++++++++++++++++-------------------
2 files changed, 35 insertions(+), 19 deletions(-)
diff --git a/src/filter-private.h b/src/filter-private.h
index 91a1eb7d..afe17c2c 100644
--- a/src/filter-private.h
+++ b/src/filter-private.h
@@ -57,10 +57,18 @@ struct pointer_tracker {
uint32_t dir;
};
+/* For smoothing timestamps from devices with unreliable timing */
+struct pointer_delta_smoothener {
+ uint64_t threshold;
+ uint64_t value;
+};
+
struct pointer_trackers {
struct pointer_tracker *trackers;
size_t ntrackers;
unsigned int cur_tracker;
+
+ struct pointer_delta_smoothener *smoothener;
};
void init_trackers(struct pointer_trackers *trackers,
diff --git a/src/filter.c b/src/filter.c
index 28e39c9c..5700128b 100644
--- a/src/filter.c
+++ b/src/filter.c
@@ -144,10 +144,6 @@ struct pointer_accelerator {
double accel; /* unitless factor */
double incline; /* incline of the function */
- /* For smoothing timestamps from devices with unreliable timing */
- uint64_t event_delta_smooth_threshold;
- uint64_t event_delta_smooth_value;
-
int dpi;
};
@@ -189,6 +185,7 @@ init_trackers(struct pointer_trackers *trackers,
sizeof(*trackers->trackers));
trackers->ntrackers = ntrackers;
trackers->cur_tracker = 0;
+ trackers->smoothener = NULL;
}
void
@@ -225,21 +222,22 @@ tracker_by_offset(struct pointer_trackers *trackers, unsigned int offset)
}
static double
-calculate_tracker_velocity(struct pointer_accelerator *accel,
- struct pointer_tracker *tracker, uint64_t time)
+calculate_tracker_velocity(struct pointer_tracker *tracker,
+ uint64_t time,
+ struct pointer_delta_smoothener *smoothener)
{
uint64_t tdelta = time - tracker->time + 1;
- if (tdelta < accel->event_delta_smooth_threshold)
- tdelta = accel->event_delta_smooth_value;
+ if (smoothener && tdelta < smoothener->threshold)
+ tdelta = smoothener->value;
return hypot(tracker->delta.x, tracker->delta.y) /
(double)tdelta; /* units/us */
}
-static inline double
-calculate_velocity_after_timeout(struct pointer_accelerator *accel,
- struct pointer_tracker *tracker)
+static double
+calculate_velocity_after_timeout(struct pointer_tracker *tracker,
+ struct pointer_delta_smoothener *smoothener)
{
/* First movement after timeout needs special handling.
*
@@ -252,8 +250,9 @@ calculate_velocity_after_timeout(struct pointer_accelerator *accel,
* for really slow movements but provides much more useful initial
* movement in normal use-cases (pause, move, pause, move)
*/
- return calculate_tracker_velocity(accel, tracker,
- tracker->time + MOTION_TIMEOUT);
+ return calculate_tracker_velocity(tracker,
+ tracker->time + MOTION_TIMEOUT,
+ smoothener);
}
/**
@@ -266,6 +265,7 @@ calculate_velocity_after_timeout(struct pointer_accelerator *accel,
static double
calculate_velocity(struct pointer_accelerator *accel, uint64_t time)
{
+ struct pointer_trackers *trackers = &accel->trackers;
struct pointer_tracker *tracker;
double velocity;
double result = 0.0;
@@ -273,12 +273,12 @@ calculate_velocity(struct pointer_accelerator *accel, uint64_t time)
double velocity_diff;
unsigned int offset;
- unsigned int dir = tracker_by_offset(&accel->trackers, 0)->dir;
+ unsigned int dir = tracker_by_offset(trackers, 0)->dir;
/* Find least recent vector within a timelimit, maximum velocity diff
* and direction threshold. */
for (offset = 1; offset < accel->trackers.ntrackers; offset++) {
- tracker = tracker_by_offset(&accel->trackers, offset);
+ tracker = tracker_by_offset(trackers, offset);
/* Bug: time running backwards */
if (tracker->time > time)
@@ -287,11 +287,15 @@ calculate_velocity(struct pointer_accelerator *accel, uint64_t time)
/* Stop if too far away in time */
if (time - tracker->time > MOTION_TIMEOUT) {
if (offset == 1)
- result = calculate_velocity_after_timeout(accel, tracker);
+ result = calculate_velocity_after_timeout(
+ tracker,
+ trackers->smoothener);
break;
}
- velocity = calculate_tracker_velocity(accel, tracker, time);
+ velocity = calculate_tracker_velocity(tracker,
+ time,
+ trackers->smoothener);
/* Stop if direction changed */
dir &= tracker->dir;
@@ -990,6 +994,7 @@ create_pointer_accelerator_filter_touchpad(int dpi,
uint64_t event_delta_smooth_value)
{
struct pointer_accelerator *filter;
+ struct pointer_delta_smoothener *smoothener;
filter = create_default_filter(dpi);
if (!filter)
@@ -997,8 +1002,11 @@ create_pointer_accelerator_filter_touchpad(int dpi,
filter->base.interface = &accelerator_interface_touchpad;
filter->profile = touchpad_accel_profile_linear;
- filter->event_delta_smooth_threshold = event_delta_smooth_threshold;
- filter->event_delta_smooth_value = event_delta_smooth_value;
+
+ smoothener = zalloc(sizeof(*smoothener));
+ smoothener->threshold = event_delta_smooth_threshold,
+ smoothener->value = event_delta_smooth_value,
+ filter->trackers.smoothener = smoothener;
return &filter->base;
}
--
2.14.3
More information about the wayland-devel
mailing list