gestures: push tp_gesture_end() into the actual state machine
authorPeter Hutterer <peter.hutterer@who-t.net>
Thu, 12 Sep 2024 09:36:38 +0000 (19:36 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Fri, 4 Oct 2024 05:13:23 +0000 (15:13 +1000)
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1049>

src/evdev-mt-touchpad-gestures.c

index 0ade3b61a30d11fb9b4c7473bf4b820f7f39a692..d82fcc96bc23040067fa86143863a0608eb6a7d0 100644 (file)
@@ -647,10 +647,14 @@ tp_gesture_handle_event_on_state_hold(struct tp_dispatch *tp,
                log_gesture_bug(tp, event);
                break;
        case GESTURE_EVENT_END:
-       case GESTURE_EVENT_CANCEL:
+       case GESTURE_EVENT_CANCEL: {
+               bool cancelled = event == GESTURE_EVENT_CANCEL;
+               gesture_notify_hold_end(&tp->device->base, time,
+                                       tp->gesture.finger_count, cancelled);
                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;
@@ -692,10 +696,14 @@ tp_gesture_handle_event_on_state_hold_and_motion(struct tp_dispatch *tp,
                log_gesture_bug(tp, event);
                break;
        case GESTURE_EVENT_END:
-       case GESTURE_EVENT_CANCEL:
+       case GESTURE_EVENT_CANCEL: {
+               bool cancelled = event == GESTURE_EVENT_CANCEL;
+               gesture_notify_hold_end(&tp->device->base, time,
+                                       tp->gesture.finger_count, cancelled);
                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;
@@ -764,6 +772,7 @@ tp_gesture_handle_event_on_state_scroll(struct tp_dispatch *tp,
        case GESTURE_EVENT_RESET:
        case GESTURE_EVENT_END:
        case GESTURE_EVENT_CANCEL:
+               tp_gesture_stop_twofinger_scroll(tp, time);
                libinput_timer_cancel(&tp->gesture.hold_timer);
                tp->gesture.state = GESTURE_STATE_NONE;
                break;
@@ -796,10 +805,16 @@ tp_gesture_handle_event_on_state_pinch(struct tp_dispatch *tp,
                log_gesture_bug(tp, event);
                break;
        case GESTURE_EVENT_END:
-       case GESTURE_EVENT_CANCEL:
+       case GESTURE_EVENT_CANCEL: {
+               bool cancelled = event == GESTURE_EVENT_CANCEL;
+               gesture_notify_pinch_end(&tp->device->base, time,
+                                        tp->gesture.finger_count,
+                                        tp->gesture.prev_scale,
+                                        cancelled);
                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;
@@ -825,10 +840,16 @@ tp_gesture_handle_event_on_state_swipe(struct tp_dispatch *tp,
                log_gesture_bug(tp, event);
                break;
        case GESTURE_EVENT_END:
-       case GESTURE_EVENT_CANCEL:
+       case GESTURE_EVENT_CANCEL: {
+               bool cancelled = event == GESTURE_EVENT_CANCEL;
+               gesture_notify_swipe_end(&tp->device->base,
+                                        time,
+                                        tp->gesture.finger_count,
+                                        cancelled);
                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;
@@ -1396,44 +1417,11 @@ tp_gesture_stop_twofinger_scroll(struct tp_dispatch *tp, uint64_t time)
 static void
 tp_gesture_end(struct tp_dispatch *tp, uint64_t time, bool cancelled)
 {
-       enum tp_gesture_state state = tp->gesture.state;
-
        if (!tp->gesture.started) {
                tp_gesture_handle_event(tp, GESTURE_EVENT_RESET, time);
                return;
        }
 
-       switch (state) {
-       case GESTURE_STATE_NONE:
-       case GESTURE_STATE_UNKNOWN:
-               evdev_log_bug_libinput(tp->device,
-                                      "%s in unknown gesture mode\n",
-                                      __func__);
-               break;
-       case GESTURE_STATE_HOLD:
-       case GESTURE_STATE_HOLD_AND_MOTION:
-               gesture_notify_hold_end(&tp->device->base, time,
-                                       tp->gesture.finger_count, cancelled);
-               break;
-       case GESTURE_STATE_SCROLL:
-               tp_gesture_stop_twofinger_scroll(tp, time);
-               break;
-       case GESTURE_STATE_PINCH:
-               gesture_notify_pinch_end(&tp->device->base, time,
-                                        tp->gesture.finger_count,
-                                        tp->gesture.prev_scale,
-                                        cancelled);
-               break;
-       case GESTURE_STATE_SWIPE:
-               gesture_notify_swipe_end(&tp->device->base,
-                                        time,
-                                        tp->gesture.finger_count,
-                                        cancelled);
-               break;
-       case GESTURE_STATE_POINTER_MOTION:
-               break;
-       }
-
        tp->gesture.started = false;
        tp_gesture_handle_event(tp, cancelled ? GESTURE_EVENT_CANCEL : GESTURE_EVENT_END, time);
 }