touchpad: fix double/multitap timeouts
authorPeter Hutterer <peter.hutterer@who-t.net>
Mon, 27 Apr 2015 23:50:02 +0000 (09:50 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Mon, 4 May 2015 00:22:58 +0000 (10:22 +1000)
The current doubletap timeout was incorrect, it gave the user only 180ms to
touch, release, touch, release to recognise a doubletap. But it would also set
a timeout on the second release, delaying the button events by 180ms.

Instead, re-arm the timer on the second touch down. This gives the user 180ms
to release and touch again (or time out). This makes doubletap much more
reliable and reduces the delay between the release and the button events
arriving since the finger down time is already counted.

Same fix for MULTITAP, though we already armed the timer on touch down so we
just have to remove the new timer on touch release which did little but delay
everything.

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

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
src/evdev-mt-touchpad-tap.c

index 7d1fc84..50e1512 100644 (file)
@@ -224,6 +224,7 @@ tp_tap_tapped_handle_event(struct tp_dispatch *tp,
                break;
        case TAP_EVENT_TOUCH:
                tp->tap.state = TAP_STATE_DRAGGING_OR_DOUBLETAP;
+               tp_tap_set_timer(tp, time);
                break;
        case TAP_EVENT_TIMEOUT:
                tp->tap.state = TAP_STATE_IDLE;
@@ -355,7 +356,6 @@ tp_tap_dragging_or_doubletap_handle_event(struct tp_dispatch *tp,
        case TAP_EVENT_RELEASE:
                tp->tap.state = TAP_STATE_MULTITAP;
                tp_tap_notify(tp, time, 1, LIBINPUT_BUTTON_STATE_RELEASED);
-               tp_tap_set_timer(tp, time);
                break;
        case TAP_EVENT_MOTION:
        case TAP_EVENT_TIMEOUT:
@@ -487,7 +487,6 @@ tp_tap_multitap_down_handle_event(struct tp_dispatch *tp,
        case TAP_EVENT_RELEASE:
                tp->tap.state = TAP_STATE_MULTITAP;
                tp_tap_notify(tp, time, 1, LIBINPUT_BUTTON_STATE_RELEASED);
-               tp_tap_set_timer(tp, time);
                break;
        case TAP_EVENT_TOUCH:
                tp->tap.state = TAP_STATE_DRAGGING_2;