gestures: replace switch-timeout based gesture_cancel calls with a state

Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1049>
This commit is contained in:
Peter Hutterer 2024-09-12 18:29:40 +10:00
parent 6b5aeab51e
commit 96500d81fb

View file

@ -40,6 +40,7 @@
enum gesture_event {
GESTURE_EVENT_RESET,
GESTURE_EVENT_FINGER_DETECTED,
GESTURE_EVENT_FINGER_SWITCH_TIMEOUT,
GESTURE_EVENT_HOLD_TIMEOUT,
GESTURE_EVENT_HOLD_AND_MOTION,
GESTURE_EVENT_POINTER_MOTION,
@ -79,6 +80,7 @@ gesture_event_to_str(enum gesture_event event)
switch(event) {
CASE_RETURN_STRING(GESTURE_EVENT_RESET);
CASE_RETURN_STRING(GESTURE_EVENT_FINGER_DETECTED);
CASE_RETURN_STRING(GESTURE_EVENT_FINGER_SWITCH_TIMEOUT);
CASE_RETURN_STRING(GESTURE_EVENT_HOLD_TIMEOUT);
CASE_RETURN_STRING(GESTURE_EVENT_HOLD_AND_MOTION);
CASE_RETURN_STRING(GESTURE_EVENT_POINTER_MOTION);
@ -576,6 +578,7 @@ tp_gesture_handle_event_on_state_none(struct tp_dispatch *tp,
case GESTURE_EVENT_SCROLL:
tp->gesture.state = GESTURE_STATE_SCROLL;
break;
case GESTURE_EVENT_FINGER_SWITCH_TIMEOUT:
case GESTURE_EVENT_HOLD_AND_MOTION:
case GESTURE_EVENT_SWIPE:
case GESTURE_EVENT_PINCH:
@ -594,6 +597,8 @@ tp_gesture_handle_event_on_state_unknown(struct tp_dispatch *tp,
libinput_timer_cancel(&tp->gesture.hold_timer);
tp->gesture.state = GESTURE_STATE_NONE;
break;
case GESTURE_EVENT_FINGER_SWITCH_TIMEOUT:
break;
case GESTURE_EVENT_HOLD_TIMEOUT:
tp->gesture.state = GESTURE_STATE_HOLD;
tp_gesture_start(tp, time);
@ -634,6 +639,9 @@ tp_gesture_handle_event_on_state_hold(struct tp_dispatch *tp,
libinput_timer_cancel(&tp->gesture.hold_timer);
tp->gesture.state = GESTURE_STATE_NONE;
break;
case GESTURE_EVENT_FINGER_SWITCH_TIMEOUT:
tp_gesture_cancel(tp, time);
break;
case GESTURE_EVENT_HOLD_AND_MOTION:
tp->gesture.state = GESTURE_STATE_HOLD_AND_MOTION;
break;
@ -672,6 +680,9 @@ tp_gesture_handle_event_on_state_hold_and_motion(struct tp_dispatch *tp,
libinput_timer_cancel(&tp->gesture.hold_timer);
tp->gesture.state = GESTURE_STATE_NONE;
break;
case GESTURE_EVENT_FINGER_SWITCH_TIMEOUT:
tp_gesture_cancel(tp, time);
break;
case GESTURE_EVENT_POINTER_MOTION:
tp_gesture_cancel(tp, time);
tp->gesture.state = GESTURE_STATE_POINTER_MOTION;
@ -714,6 +725,7 @@ tp_gesture_handle_event_on_state_pointer_motion(struct tp_dispatch *tp,
tp_gesture_start(tp, time);
}
break;
case GESTURE_EVENT_FINGER_SWITCH_TIMEOUT:
case GESTURE_EVENT_HOLD_AND_MOTION:
case GESTURE_EVENT_FINGER_DETECTED:
case GESTURE_EVENT_POINTER_MOTION:
@ -735,6 +747,9 @@ tp_gesture_handle_event_on_state_scroll(struct tp_dispatch *tp,
libinput_timer_cancel(&tp->gesture.hold_timer);
tp->gesture.state = GESTURE_STATE_NONE;
break;
case GESTURE_EVENT_FINGER_SWITCH_TIMEOUT:
tp_gesture_cancel(tp, time);
break;
case GESTURE_EVENT_PINCH:
tp_gesture_init_pinch(tp);
tp_gesture_cancel(tp, time);
@ -761,6 +776,9 @@ tp_gesture_handle_event_on_state_pinch(struct tp_dispatch *tp,
libinput_timer_cancel(&tp->gesture.hold_timer);
tp->gesture.state = GESTURE_STATE_NONE;
break;
case GESTURE_EVENT_FINGER_SWITCH_TIMEOUT:
tp_gesture_cancel(tp, time);
break;
case GESTURE_EVENT_HOLD_AND_MOTION:
case GESTURE_EVENT_FINGER_DETECTED:
case GESTURE_EVENT_HOLD_TIMEOUT:
@ -783,6 +801,9 @@ tp_gesture_handle_event_on_state_swipe(struct tp_dispatch *tp,
libinput_timer_cancel(&tp->gesture.hold_timer);
tp->gesture.state = GESTURE_STATE_NONE;
break;
case GESTURE_EVENT_FINGER_SWITCH_TIMEOUT:
tp_gesture_cancel(tp, time);
break;
case GESTURE_EVENT_HOLD_AND_MOTION:
case GESTURE_EVENT_FINGER_DETECTED:
case GESTURE_EVENT_HOLD_TIMEOUT:
@ -1416,7 +1437,7 @@ tp_gesture_finger_count_switch_timeout(uint64_t now, void *data)
if (!tp->gesture.finger_count_pending)
return;
tp_gesture_cancel(tp, now); /* End current gesture */
tp_gesture_handle_event(tp, GESTURE_EVENT_FINGER_SWITCH_TIMEOUT, now);
tp->gesture.finger_count = tp->gesture.finger_count_pending;
tp->gesture.finger_count_pending = 0;
}