From 280755a7c843625626ec1e4ccac42f879fe36ab2 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 2 Jul 2014 15:00:31 +1000 Subject: [PATCH] touchpad: drop the BOTTOM_TO_AREA/BOTTOM_NEW states The original intention of this state was to prevent an accidental move out of the bottom software button to start moving the cursor. That ends up actually preventing a number of normal moves that start low enough. Simply drop the state. Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede --- doc/touchpad-softbutton-state-machine.svg | 888 ++++++++++++------------------ src/evdev-mt-touchpad-buttons.c | 86 +-- src/evdev-mt-touchpad.h | 2 - 3 files changed, 362 insertions(+), 614 deletions(-) diff --git a/doc/touchpad-softbutton-state-machine.svg b/doc/touchpad-softbutton-state-machine.svg index 05254d0..1d569bf 100644 --- a/doc/touchpad-softbutton-state-machine.svg +++ b/doc/touchpad-softbutton-state-machine.svg @@ -1,532 +1,360 @@ + - - - - - - - -NONE - -on-entry: - -curr = none - - - - -BOTTOM_NEW - -on-entry: - -curr = button - -start enter timeout - - - - -AREA - -on-entry: - -curr =area - -set_pointer() - - - - -finger in - -area or top - - - - -BOTTOM - - - - -finger - -up - - - - -phys - -button - -press - - - - - - -enter - -timeout - - - - - - - - -finger in - -area or top - - - - - - -BOTTOM_TO_AREA - -on-entry: - -start leave timeout - - - - - - -leave - -timeout - - - - - - - - -finger in - -bottom - - - - - - - - -finger in - -area - - - - - - - - -finger in - -bottom - -button != curr - - - - - - - - - - - - -finger in - -bottom - -button == curr - - - - - - - - - - - - - - - - - - - -Check state of - -all touches - - - - - - - - - -tp_post_softbutton_buttons() - - - - -!buttons.click_pend - -&& current == old - - - - - - -yes - - - - - - -no - - - - - - -current = buttons.state & 0x01 - -old = buttons.old_state & 0x01 - -button = 0 - - - - - - -All touches are in state none - - - - - - -no - - - - - - -yes - - - - -buttons.click_pend = 1 - - - - - - -(Some touches are in middle) || - -((Some touches are in right) && - -(Some touches are in left)) - - - - - - -yes - - - - -button = BTN_MIDDLE - - - - - - -current - - - - - - -no - - - - - - -yes - - - - -Some touches are in right - - - - - - -yes - - - - - - -no - - - - -button = BTN_RIGHT - - - - -button = BTN_LEFT - - - - - - -no - - - - -buttons.active = button - -state = BUTTON_PRESSED - - - - - - - - - - -button = buttons.active - -buttons.active = 0 - -state = BUTTON_RELEASED - - - - -buttons.click_pend = 0 - - - - - - - - -button - - - - - - -no - - - - - - -yes - - - - -pointer_notify_button( - -button, state) - - - - - - - - - - -finger in - -top - - - - - - - -TOP_NEW - -on-entry: - -curr = button - -start enter timeout - - - - - - - -TOP - - - - - -phys - -button - -press - - - - -enter - -timeout - - - - -finger in - -top - -button != curr - - - - - - - - - - - - - - - - - - -finger in - -area or - -bottom - - - - - - - - -TOP_TO_IGNORE - -on-entry: - -start leave timeout - - - - -finger in - -area or bottom - - - - -finger in - -top - -button == curr - - - - - - - - - - - - - - -IGNORE - -on-entry: - -curr =none - - - - -leave - -timeout - - - - - - - - - - + + + + + + + NONE + on-entry: + curr = none + + + + BOTTOM + on-entry: + curr = button + + + + AREA + on-entry: + curr =area + set_pointer() + + + + finger in + area or top + + + + finger + up + + + + + + finger in + bottom + + + + + + + + finger in + area + + + + + + + + finger in + bottom + button != curr + + + + + + + + + + + + + Check state of + all touches + + + + + + + + + tp_post_softbutton_buttons() + + + + !buttons.click_pend + && current == old + + + + + + yes + + + + + + no + + + + + + current = buttons.state & 0x01 + old = buttons.old_state & 0x01 + button = 0 + + + + + + All touches are in state none + + + + + + no + + + + + + yes + + + + buttons.click_pend = 1 + + + + + + (Some touches are in middle) || + ((Some touches are in right) && + (Some touches are in left)) + + + + + + yes + + + + button = BTN_MIDDLE + + + + + + current + + + + + + no + + + + + + yes + + + + Some touches are in right + + + + + + yes + + + + + + no + + + + button = BTN_RIGHT + + + + button = BTN_LEFT + + + + + + no + + + + buttons.active = button + state = BUTTON_PRESSED + + + + + + + + + + button = buttons.active + buttons.active = 0 + state = BUTTON_RELEASED + + + + buttons.click_pend = 0 + + + + + + + + button + + + + + + no + + + + + + yes + + + + pointer_notify_button( + button, state) + + + + + + + + + + finger in + top + + + + + + TOP_NEW + on-entry: + curr = button + start enter timeout + + + + + + + TOP + + + + + phys + button + press + + + + enter + timeout + + + + finger in + top + button != curr + + + + + + + + + + + + + + + + + + finger in + area or + bottom + + + + + + + + TOP_TO_IGNORE + on-entry: + start leave timeout + + + + finger in + area or bottom + + + + finger in + top + button == curr + + + + + + + + + + + + + + IGNORE + on-entry: + curr =none + + + + leave + timeout + + + + + + + + + + diff --git a/src/evdev-mt-touchpad-buttons.c b/src/evdev-mt-touchpad-buttons.c index 9848a32..520a47f 100644 --- a/src/evdev-mt-touchpad-buttons.c +++ b/src/evdev-mt-touchpad-buttons.c @@ -52,8 +52,6 @@ button_state_to_str(enum button_state state) { CASE_RETURN_STRING(BUTTON_STATE_NONE); CASE_RETURN_STRING(BUTTON_STATE_AREA); CASE_RETURN_STRING(BUTTON_STATE_BOTTOM); - CASE_RETURN_STRING(BUTTON_STATE_BOTTOM_NEW); - CASE_RETURN_STRING(BUTTON_STATE_BOTTOM_TO_AREA); CASE_RETURN_STRING(BUTTON_STATE_TOP); CASE_RETURN_STRING(BUTTON_STATE_TOP_NEW); CASE_RETURN_STRING(BUTTON_STATE_TOP_TO_IGNORE); @@ -161,13 +159,7 @@ tp_button_set_state(struct tp_dispatch *tp, struct tp_touch *t, tp_set_pointer(tp, t); break; case BUTTON_STATE_BOTTOM: - break; - case BUTTON_STATE_BOTTOM_NEW: t->button.curr = event; - tp_button_set_enter_timer(tp, t); - break; - case BUTTON_STATE_BOTTOM_TO_AREA: - tp_button_set_leave_timer(tp, t); break; case BUTTON_STATE_TOP: break; @@ -192,7 +184,7 @@ tp_button_none_handle_event(struct tp_dispatch *tp, switch (event) { case BUTTON_EVENT_IN_BOTTOM_R: case BUTTON_EVENT_IN_BOTTOM_L: - tp_button_set_state(tp, t, BUTTON_STATE_BOTTOM_NEW, event); + tp_button_set_state(tp, t, BUTTON_STATE_BOTTOM, event); break; case BUTTON_EVENT_IN_TOP_R: case BUTTON_EVENT_IN_TOP_M: @@ -237,92 +229,28 @@ tp_button_area_handle_event(struct tp_dispatch *tp, static void tp_button_bottom_handle_event(struct tp_dispatch *tp, - struct tp_touch *t, - enum button_event event) + struct tp_touch *t, + enum button_event event) { switch (event) { case BUTTON_EVENT_IN_BOTTOM_R: case BUTTON_EVENT_IN_BOTTOM_L: if (event != t->button.curr) - tp_button_set_state(tp, t, BUTTON_STATE_BOTTOM_NEW, - event); - break; - case BUTTON_EVENT_IN_TOP_R: - case BUTTON_EVENT_IN_TOP_M: - case BUTTON_EVENT_IN_TOP_L: - case BUTTON_EVENT_IN_AREA: - tp_button_set_state(tp, t, BUTTON_STATE_BOTTOM_TO_AREA, event); - break; - case BUTTON_EVENT_UP: - tp_button_set_state(tp, t, BUTTON_STATE_NONE, event); - break; - case BUTTON_EVENT_PRESS: - case BUTTON_EVENT_RELEASE: - case BUTTON_EVENT_TIMEOUT: - break; - } -} - -static void -tp_button_bottom_new_handle_event(struct tp_dispatch *tp, - struct tp_touch *t, - enum button_event event) -{ - switch(event) { - case BUTTON_EVENT_IN_BOTTOM_R: - case BUTTON_EVENT_IN_BOTTOM_L: - if (event != t->button.curr) - tp_button_set_state(tp, t, BUTTON_STATE_BOTTOM_NEW, - event); - break; - case BUTTON_EVENT_IN_TOP_R: - case BUTTON_EVENT_IN_TOP_M: - case BUTTON_EVENT_IN_TOP_L: - case BUTTON_EVENT_IN_AREA: - tp_button_set_state(tp, t, BUTTON_STATE_AREA, event); - break; - case BUTTON_EVENT_UP: - tp_button_set_state(tp, t, BUTTON_STATE_NONE, event); - break; - case BUTTON_EVENT_PRESS: - tp_button_set_state(tp, t, BUTTON_STATE_BOTTOM, event); - break; - case BUTTON_EVENT_RELEASE: - break; - case BUTTON_EVENT_TIMEOUT: - tp_button_set_state(tp, t, BUTTON_STATE_BOTTOM, event); - break; - } -} - -static void -tp_button_bottom_to_area_handle_event(struct tp_dispatch *tp, - struct tp_touch *t, - enum button_event event) -{ - switch(event) { - case BUTTON_EVENT_IN_BOTTOM_R: - case BUTTON_EVENT_IN_BOTTOM_L: - if (event == t->button.curr) tp_button_set_state(tp, t, BUTTON_STATE_BOTTOM, event); - else - tp_button_set_state(tp, t, BUTTON_STATE_BOTTOM_NEW, - event); break; case BUTTON_EVENT_IN_TOP_R: case BUTTON_EVENT_IN_TOP_M: case BUTTON_EVENT_IN_TOP_L: case BUTTON_EVENT_IN_AREA: + tp_button_set_state(tp, t, BUTTON_STATE_AREA, event); break; case BUTTON_EVENT_UP: tp_button_set_state(tp, t, BUTTON_STATE_NONE, event); break; case BUTTON_EVENT_PRESS: case BUTTON_EVENT_RELEASE: - break; case BUTTON_EVENT_TIMEOUT: - tp_button_set_state(tp, t, BUTTON_STATE_AREA, event); break; } } @@ -465,12 +393,6 @@ tp_button_handle_event(struct tp_dispatch *tp, case BUTTON_STATE_BOTTOM: tp_button_bottom_handle_event(tp, t, event); break; - case BUTTON_STATE_BOTTOM_NEW: - tp_button_bottom_new_handle_event(tp, t, event); - break; - case BUTTON_STATE_BOTTOM_TO_AREA: - tp_button_bottom_to_area_handle_event(tp, t, event); - break; case BUTTON_STATE_TOP: tp_button_top_handle_event(tp, t, event); break; diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h index c92c2b1..80f3f60 100644 --- a/src/evdev-mt-touchpad.h +++ b/src/evdev-mt-touchpad.h @@ -64,8 +64,6 @@ enum button_state { BUTTON_STATE_NONE, BUTTON_STATE_AREA, BUTTON_STATE_BOTTOM, - BUTTON_STATE_BOTTOM_NEW, - BUTTON_STATE_BOTTOM_TO_AREA, BUTTON_STATE_TOP, BUTTON_STATE_TOP_NEW, BUTTON_STATE_TOP_TO_IGNORE, -- 2.7.4