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 <[email protected]>
---
 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

_______________________________________________
wayland-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to