[PATCH libinput] touchpad: only use the last two coordinates for delta calculation

Peter Hutterer peter.hutterer at who-t.net
Tue Nov 22 01:34:12 UTC 2016

Taking the last 4 points means factoring in a coordinate that may be more than
40ms in the past - or even more when the finger moves slowly and we don't get
events for a while. This makes the pointer more sluggish and slower to catch up
with what the finger is actually doing.

We already have the motion hysteresis as a separate item to prevent jumps (and
thus adds some delay to the movement), the calculation over time doesn't
provide enough benefit to justify the sluggish pointer.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
I'm leaving the motion history as-is for now even though it's largely unused
now. This can be fixed up later once we know this patch has the desired
effect (it does here, but that could be confirmation bias)

 src/evdev-mt-touchpad.c | 20 +++++---------------
 1 file changed, 5 insertions(+), 15 deletions(-)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index d72cb19..7b8514c 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -262,29 +262,19 @@ tp_end_sequence(struct tp_dispatch *tp, struct tp_touch *t, uint64_t time)
 	tp_end_touch(tp, t, time);
-static double
-tp_estimate_delta(int x0, int x1, int x2, int x3)
-	return (x0 + x1 - x2 - x3) / 4.0;
 struct normalized_coords
 tp_get_delta(struct tp_touch *t)
 	struct device_float_coords delta;
 	const struct normalized_coords zero = { 0.0, 0.0 };
-	if (t->history.count < TOUCHPAD_MIN_SAMPLES)
+	if (t->history.count <= 1)
 		return zero;
-	delta.x = tp_estimate_delta(tp_motion_history_offset(t, 0)->x,
-				    tp_motion_history_offset(t, 1)->x,
-				    tp_motion_history_offset(t, 2)->x,
-				    tp_motion_history_offset(t, 3)->x);
-	delta.y = tp_estimate_delta(tp_motion_history_offset(t, 0)->y,
-				    tp_motion_history_offset(t, 1)->y,
-				    tp_motion_history_offset(t, 2)->y,
-				    tp_motion_history_offset(t, 3)->y);
+	delta.x = tp_motion_history_offset(t, 0)->x -
+		  tp_motion_history_offset(t, 1)->x;
+	delta.y = tp_motion_history_offset(t, 0)->y -
+		  tp_motion_history_offset(t, 1)->y;
 	return tp_normalize_delta(t->tp, delta);

More information about the wayland-devel mailing list