From 4923c404e8199c49106700a5c1f96f0ac3428f64 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 29 Jun 2016 10:03:23 +1000 Subject: [PATCH] gestures: make the gesture movement threshold depending on finger count 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 Reviewed-by: Hans de Goede --- 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 e4e465a6..a910bec4 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 401b0743..472fbe77 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);