[PATCH libinput] gestures: make the gesture movement threshold depending on finger count

Peter Hutterer peter.hutterer at who-t.net
Thu Jun 30 02:22:10 UTC 2016


Increase the mm move threshold for 3 and 4 finger gestures to 2 and 3 mm,
respectively. In multi-finger gestures it's common to have minor movement
while all fingers are being put down or before the conscious movement starts.
This can trigger invalid gesture detection (e.g. a pinch instead of a swipe).
Increase the movement threshold to make sure we have sufficient input data.

No changes to 2-finger movements.

https://bugs.freedesktop.org/show_bug.cgi?id=96687

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev-mt-touchpad-gestures.c |  9 ++++++---
 test/gestures.c                  | 10 +++++-----
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/src/evdev-mt-touchpad-gestures.c b/src/evdev-mt-touchpad-gestures.c
index e4e465a..a910bec 100644
--- a/src/evdev-mt-touchpad-gestures.c
+++ b/src/evdev-mt-touchpad-gestures.c
@@ -182,12 +182,15 @@ tp_gesture_get_active_touches(const struct tp_dispatch *tp,
 }
 
 static int
-tp_gesture_get_direction(struct tp_dispatch *tp, struct tp_touch *touch)
+tp_gesture_get_direction(struct tp_dispatch *tp, struct tp_touch *touch,
+			 unsigned int nfingers)
 {
 	struct normalized_coords normalized;
 	struct device_float_coords delta;
 	double move_threshold = TP_MM_TO_DPI_NORMALIZED(1);
 
+	move_threshold *= (nfingers - 1);
+
 	delta = device_delta(touch->point, touch->gesture.initial);
 
 	normalized = tp_normalize_delta(tp, delta);
@@ -347,8 +350,8 @@ tp_gesture_handle_state_unknown(struct tp_dispatch *tp, uint64_t time)
 	}
 
 	/* Else wait for both fingers to have moved */
-	dir1 = tp_gesture_get_direction(tp, first);
-	dir2 = tp_gesture_get_direction(tp, second);
+	dir1 = tp_gesture_get_direction(tp, first, tp->gesture.finger_count);
+	dir2 = tp_gesture_get_direction(tp, second, tp->gesture.finger_count);
 	if (dir1 == UNDEFINED_DIRECTION || dir2 == UNDEFINED_DIRECTION)
 		return GESTURE_STATE_UNKNOWN;
 
diff --git a/test/gestures.c b/test/gestures.c
index 401b074..472fbe7 100644
--- a/test/gestures.c
+++ b/test/gestures.c
@@ -961,13 +961,13 @@ START_TEST(gestures_pinch_4fg_btntool)
 	for (i = 0; i < 8; i++) {
 		litest_push_event_frame(dev);
 		if (dir_x > 0.0)
-			dir_x -= 2;
+			dir_x -= 3;
 		else if (dir_x < 0.0)
-			dir_x += 2;
+			dir_x += 3;
 		if (dir_y > 0.0)
-			dir_y -= 2;
+			dir_y -= 3;
 		else if (dir_y < 0.0)
-			dir_y += 2;
+			dir_y += 3;
 		litest_touch_move(dev,
 				  0,
 				  50 + dir_x,
@@ -1004,7 +1004,7 @@ START_TEST(gestures_pinch_4fg_btntool)
 		ck_assert(scale < oldscale);
 
 		angle = libinput_event_gesture_get_angle_delta(gevent);
-		ck_assert_double_le(fabs(angle), 1.0);
+		ck_assert_double_le(fabs(angle), 1.5);
 
 		libinput_event_destroy(event);
 		libinput_dispatch(li);
-- 
2.7.4



More information about the wayland-devel mailing list