From 29785df999bab3d3a015438aa1dae588c982dfc7 Mon Sep 17 00:00:00 2001 From: satrmb <10471-satrmb@users.noreply.gitlab.freedesktop.org> Date: Fri, 22 Nov 2019 15:37:53 +0100 Subject: [PATCH] touchpad: simplify tapping state machine by eliminating the multitap states Alternating between TAPPED and DRAGGING_OR_MULTITAP on repeated taps is enough, no need for more states. --- doc/touchpad-tap-state-machine.svg | 2 +- src/evdev-mt-touchpad-tap.c | 137 ++--------------------------- src/evdev-mt-touchpad.h | 3 - 3 files changed, 6 insertions(+), 136 deletions(-) diff --git a/doc/touchpad-tap-state-machine.svg b/doc/touchpad-tap-state-machine.svg index 24b28a68..37ce3544 100644 --- a/doc/touchpad-tap-state-machine.svg +++ b/doc/touchpad-tap-state-machine.svg @@ -1,3 +1,3 @@ -IDLETOUCHfirstfinger downfinger upbutton 1presstimeoutmove > thresholdsecondfinger downTOUCH_2secondfinger upbutton 2pressmove > thresholdtimeoutbutton 1releasebutton 2releaseTAPPEDtimeoutfirstfinger downDRAGGINGfirstfinger upbtn1releaseIDLEthirdfinger downTOUCH_3button 3pressbutton 3releasemove > thresholdIDLEtimeoutfirstfinger upIDLEfourthfinger downDRAGGING_OR_DOUBLETAPtimeoutfirstfinger upbutton 1releasebutton 1pressbtn1releasesecondfinger downmove > thresholdHOLDfirstfinger upsecondfinger downTOUCH_2_HOLDsecondfinger upfirstfinger upthirdfinger downTOUCH_3_HOLDfourthfinger downDEADany finger upfourthfinger upany finger upyesany finger upIDLEif fingercount == 0secondfinger upDRAGGING_2firstfinger upsecondfinger downthirdfinger downbtn1releasephysbuttonpressphysbuttonpressbutton 1releaseDRAGGING_WAITtimeoutfirstfinger downTOUCH_TOUCHTOUCH_IDLETOUCH_DEADTOUCH_DEADTOUCH_IDLETOUCH_TOUCHTOUCH_IDLETOUCH_IDLETOUCH_TOUCHthat fingerTOUCH_IDLETOUCH_DEADthat fingerTOUCH_IDLEnoTOUCH_TOUCHTOUCH_IDLETOUCH_TOUCHTOUCH_DEADTOUCH_IDLETOUCH_TOUCHTOUCH_TOUCHTOUCH_IDLETOUCH_IDLETOUCH_TOUCHTOUCH_IDLETOUCH_TOUCHthat fingerTOUCH_IDLETOUCH_DEADTOUCH_DEADTOUCH_DEADTOUCH_DEADTOUCH_DEADTOUCH_DEADthat finger state ==TOUCH_TOUCHTOUCH_DEADTOUCH_DEADTOUCH_DEADfirstfinger downMULTITAPtimeoutIDLEMULTITAP_DOWNfirstfinger uptimeoutsecondfinger downmove > thresholdTOUCH_TOUCHTOUCH_IDLEphysbuttonpressDRAGGING_OR_TAPfirstfinger uptimeoutmove > thresholdTOUCH_IDLE
drag lock
enabled?
[Not supported by viewer]
no
no
yes
yes<br>
thumbTOUCH_DEADTOUCH_2_RELEASEsecondfinger uptimeoutmove > thresholdfirstfinger downTOUCH_IDLEfirstfinger upsecondfinger downTOUCH_DEADTOUCH_DEAD
drag
disabled?
drag<br>disabled?<br>
no
no
yes
yes
palmeither fingerpalmremaining fingerpalmany fingerpalmthat fingerTOUCH_DEADthat fingerTOUCH_DEADpalmany fingerpalmthat fingerTOUCH_DEADTOUCH_DEADpalmTOUCH_DEADany fingerpalmthat fingerTOUCH_DEADeither fingerpalmthat fingerTOUCH_DEADpalmTOUCH_DEADany fingerpalmthat fingerTOUCH_DEADpalmbutton 1pressTOUCH_DEADbtn1releaseMULTITAP_PALMfirstfinger downTOUCH_TOUCHtimeoutphysbuttonpressTOUCH_DEADmove > thresholdmove > threshold
\ No newline at end of file +IDLETOUCHfirstfinger downfinger upbutton 1presstimeoutmove > thresholdsecondfinger downTOUCH_2secondfinger upbutton 2pressmove > thresholdtimeoutbutton 1releasebutton 2releaseTAPPEDtimeoutfirstfinger downDRAGGINGfirstfinger upbtn1releaseIDLEthirdfinger downTOUCH_3button 3pressbutton 3releasemove > thresholdIDLEtimeoutfirstfinger upIDLEfourthfinger downDRAGGING_OR_DOUBLETAPtimeoutfirstfinger upbutton 1releasesecondfinger downmove > thresholdHOLDfirstfinger upsecondfinger downTOUCH_2_HOLDsecondfinger upfirstfinger upthirdfinger downTOUCH_3_HOLDfourthfinger downDEADany finger upfourthfinger upany finger upyesany finger upIDLEif fingercount == 0secondfinger upDRAGGING_2firstfinger upsecondfinger downthirdfinger downbtn1releasephysbuttonpressphysbuttonpressbutton 1releaseDRAGGING_WAITtimeoutfirstfinger downTOUCH_TOUCHTOUCH_IDLETOUCH_DEADTOUCH_DEADTOUCH_IDLETOUCH_TOUCHTOUCH_IDLETOUCH_IDLETOUCH_TOUCHthat fingerTOUCH_IDLETOUCH_DEADthat fingerTOUCH_IDLEnoTOUCH_TOUCHTOUCH_IDLETOUCH_TOUCHTOUCH_DEADTOUCH_IDLETOUCH_TOUCHTOUCH_TOUCHTOUCH_IDLETOUCH_IDLETOUCH_TOUCHTOUCH_IDLETOUCH_TOUCHthat fingerTOUCH_IDLETOUCH_DEADTOUCH_DEADTOUCH_DEADTOUCH_DEADTOUCH_DEADTOUCH_DEADthat finger state ==TOUCH_TOUCHTOUCH_DEADTOUCH_DEADTOUCH_DEADDRAGGING_OR_TAPfirstfinger uptimeoutmove > thresholdTOUCH_IDLE
drag lock
enabled?
[Not supported by viewer]
no
no
yes
yes<br>
thumbTOUCH_DEADTOUCH_2_RELEASEsecondfinger uptimeoutmove > thresholdfirstfinger downTOUCH_IDLEfirstfinger upsecondfinger downTOUCH_DEADTOUCH_DEAD
drag
disabled?
drag<br>disabled?<br>
no
no
yes
yes
palmeither fingerpalmremaining fingerpalmany fingerpalmthat fingerTOUCH_DEADthat fingerTOUCH_DEADpalmany fingerpalmthat fingerTOUCH_DEADTOUCH_DEADpalmTOUCH_DEADany fingerpalmthat fingerTOUCH_DEADeither fingerpalmthat fingerTOUCH_DEADpalmTOUCH_DEADany fingerpalmthat fingerTOUCH_DEADTOUCH_DEADmove > thresholdmove > thresholdbutton 1press
\ No newline at end of file diff --git a/src/evdev-mt-touchpad-tap.c b/src/evdev-mt-touchpad-tap.c index e103856e..7b5de8b6 100644 --- a/src/evdev-mt-touchpad-tap.c +++ b/src/evdev-mt-touchpad-tap.c @@ -71,9 +71,6 @@ tap_state_to_str(enum tp_tap_state state) CASE_RETURN_STRING(TAP_STATE_DRAGGING_OR_DOUBLETAP); CASE_RETURN_STRING(TAP_STATE_DRAGGING_OR_TAP); CASE_RETURN_STRING(TAP_STATE_DRAGGING_2); - CASE_RETURN_STRING(TAP_STATE_MULTITAP); - CASE_RETURN_STRING(TAP_STATE_MULTITAP_DOWN); - CASE_RETURN_STRING(TAP_STATE_MULTITAP_PALM); CASE_RETURN_STRING(TAP_STATE_DEAD); } return NULL; @@ -540,11 +537,15 @@ tp_tap_dragging_or_doubletap_handle_event(struct tp_dispatch *tp, tp->tap.state = TAP_STATE_DRAGGING_2; break; case TAP_EVENT_RELEASE: - tp->tap.state = TAP_STATE_MULTITAP; + tp->tap.state = TAP_STATE_TAPPED; tp_tap_notify(tp, tp->tap.saved_release_time, 1, LIBINPUT_BUTTON_STATE_RELEASED); + tp_tap_notify(tp, + tp->tap.saved_press_time, + 1, + LIBINPUT_BUTTON_STATE_PRESSED); tp->tap.saved_release_time = time; tp_tap_set_timer(tp, time); break; @@ -712,124 +713,6 @@ tp_tap_dragging2_handle_event(struct tp_dispatch *tp, } } -static void -tp_tap_multitap_handle_event(struct tp_dispatch *tp, - struct tp_touch *t, - enum tap_event event, uint64_t time) -{ - switch (event) { - case TAP_EVENT_RELEASE: - log_tap_bug(tp, t, event); - break; - case TAP_EVENT_TOUCH: - tp->tap.state = TAP_STATE_MULTITAP_DOWN; - tp_tap_notify(tp, - tp->tap.saved_press_time, - 1, - LIBINPUT_BUTTON_STATE_PRESSED); - tp->tap.saved_press_time = time; - tp_tap_set_timer(tp, time); - break; - case TAP_EVENT_MOTION: - log_tap_bug(tp, t, event); - break; - case TAP_EVENT_TIMEOUT: - tp->tap.state = TAP_STATE_IDLE; - tp_tap_notify(tp, - tp->tap.saved_press_time, - 1, - LIBINPUT_BUTTON_STATE_PRESSED); - tp_tap_notify(tp, - tp->tap.saved_release_time, - 1, - LIBINPUT_BUTTON_STATE_RELEASED); - break; - case TAP_EVENT_BUTTON: - tp->tap.state = TAP_STATE_IDLE; - tp_tap_clear_timer(tp); - break; - case TAP_EVENT_THUMB: - case TAP_EVENT_PALM: - break; - case TAP_EVENT_PALM_UP: - break; - } -} - -static void -tp_tap_multitap_down_handle_event(struct tp_dispatch *tp, - struct tp_touch *t, - enum tap_event event, - uint64_t time) -{ - switch (event) { - case TAP_EVENT_RELEASE: - tp->tap.state = TAP_STATE_MULTITAP; - tp_tap_notify(tp, - tp->tap.saved_release_time, - 1, - LIBINPUT_BUTTON_STATE_RELEASED); - tp->tap.saved_release_time = time; - tp_tap_set_timer(tp, time); - break; - case TAP_EVENT_TOUCH: - tp->tap.state = TAP_STATE_DRAGGING_2; - tp_tap_clear_timer(tp); - break; - case TAP_EVENT_MOTION: - case TAP_EVENT_TIMEOUT: - tp->tap.state = TAP_STATE_DRAGGING; - tp_tap_clear_timer(tp); - break; - case TAP_EVENT_BUTTON: - tp->tap.state = TAP_STATE_DEAD; - tp_tap_notify(tp, - tp->tap.saved_release_time, - 1, - LIBINPUT_BUTTON_STATE_RELEASED); - tp_tap_clear_timer(tp); - break; - case TAP_EVENT_THUMB: - break; - case TAP_EVENT_PALM: - tp->tap.state = TAP_STATE_MULTITAP_PALM; - break; - case TAP_EVENT_PALM_UP: - break; - } -} - -static void -tp_tap_multitap_palm_handle_event(struct tp_dispatch *tp, - struct tp_touch *t, - enum tap_event event, - uint64_t time) -{ - switch (event) { - case TAP_EVENT_RELEASE: - log_tap_bug(tp, t, event); - break; - case TAP_EVENT_TOUCH: - tp->tap.state = TAP_STATE_MULTITAP_DOWN; - break; - case TAP_EVENT_MOTION: - break; - case TAP_EVENT_TIMEOUT: - case TAP_EVENT_BUTTON: - tp->tap.state = TAP_STATE_IDLE; - tp_tap_clear_timer(tp); - tp_tap_notify(tp, - tp->tap.saved_release_time, - 1, - LIBINPUT_BUTTON_STATE_RELEASED); - break; - case TAP_EVENT_THUMB: - case TAP_EVENT_PALM: - case TAP_EVENT_PALM_UP: - break; - } -} - static void tp_tap_dead_handle_event(struct tp_dispatch *tp, struct tp_touch *t, @@ -910,15 +793,6 @@ tp_tap_handle_event(struct tp_dispatch *tp, case TAP_STATE_DRAGGING_2: tp_tap_dragging2_handle_event(tp, t, event, time); break; - case TAP_STATE_MULTITAP: - tp_tap_multitap_handle_event(tp, t, event, time); - break; - case TAP_STATE_MULTITAP_DOWN: - tp_tap_multitap_down_handle_event(tp, t, event, time); - break; - case TAP_STATE_MULTITAP_PALM: - tp_tap_multitap_palm_handle_event(tp, t, event, time); - break; case TAP_STATE_DEAD: tp_tap_dead_handle_event(tp, t, event, time); break; @@ -1085,7 +959,6 @@ tp_tap_handle_state(struct tp_dispatch *tp, uint64_t time) case TAP_STATE_DRAGGING_OR_TAP: case TAP_STATE_TOUCH_2: case TAP_STATE_TOUCH_3: - case TAP_STATE_MULTITAP_DOWN: filter_motion = 1; break; diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h index 8ff97023..a8ac5d5b 100644 --- a/src/evdev-mt-touchpad.h +++ b/src/evdev-mt-touchpad.h @@ -103,9 +103,6 @@ enum tp_tap_state { TAP_STATE_DRAGGING, TAP_STATE_DRAGGING_WAIT, TAP_STATE_DRAGGING_2, - TAP_STATE_MULTITAP, - TAP_STATE_MULTITAP_DOWN, - TAP_STATE_MULTITAP_PALM, TAP_STATE_DEAD, /**< finger count exceeded */ };