gestures: don't handle SWIPE if we transitioned from SWIPE_START
authorPeter Hutterer <peter.hutterer@who-t.net>
Thu, 5 Dec 2024 03:09:43 +0000 (13:09 +1000)
committerMarge Bot <emma+marge@anholt.net>
Tue, 10 Dec 2024 06:15:21 +0000 (06:15 +0000)
If we get to SWIPE_START we send out the BEGIN event and transition to
state SWIPE. We must not process that state immediately to avoid sending
out a spurious UPDATE event when nothing has changed.

Same for the PINCH_START/PINCH and SCROLL_START/SCROLL states.

This also fixes a crasher where we end up with NaN in the custom
acceleration function because passing the same timestamp in twice causes
a division by zero (delta time is zero).

Closes #1053

Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1088>

src/evdev-mt-touchpad-gestures.c

index d557353ba1cac50a2607e8382d08252f0ade8023..371cc22b89b22cf49afc311272cadbac7b778a23 100644 (file)
@@ -1488,13 +1488,18 @@ tp_gesture_handle_state(struct tp_dispatch *tp, uint64_t time,
                if (transitions[idx - 1] != tp->gesture.state)
                        transitions[idx++] = tp->gesture.state;
        }
+       if (tp->gesture.state == GESTURE_STATE_SCROLL) {
+               tp_gesture_handle_state_scroll(tp, time);
+               if (transitions[idx - 1] != tp->gesture.state)
+                       transitions[idx++] = tp->gesture.state;
+       }
        if (tp->gesture.state == GESTURE_STATE_SCROLL_START) {
                tp_gesture_handle_state_scroll_start(tp, time);
                if (transitions[idx - 1] != tp->gesture.state)
                        transitions[idx++] = tp->gesture.state;
        }
-       if (tp->gesture.state == GESTURE_STATE_SCROLL) {
-               tp_gesture_handle_state_scroll(tp, time);
+       if (tp->gesture.state == GESTURE_STATE_SWIPE) {
+               tp_gesture_handle_state_swipe(tp, time);
                if (transitions[idx - 1] != tp->gesture.state)
                        transitions[idx++] = tp->gesture.state;
        }
@@ -1503,8 +1508,8 @@ tp_gesture_handle_state(struct tp_dispatch *tp, uint64_t time,
                if (transitions[idx - 1] != tp->gesture.state)
                        transitions[idx++] = tp->gesture.state;
        }
-       if (tp->gesture.state == GESTURE_STATE_SWIPE) {
-               tp_gesture_handle_state_swipe(tp, time);
+       if (tp->gesture.state == GESTURE_STATE_PINCH) {
+               tp_gesture_handle_state_pinch(tp, time);
                if (transitions[idx - 1] != tp->gesture.state)
                        transitions[idx++] = tp->gesture.state;
        }
@@ -1513,10 +1518,6 @@ tp_gesture_handle_state(struct tp_dispatch *tp, uint64_t time,
                if (transitions[idx - 1] != tp->gesture.state)
                        transitions[idx++] = tp->gesture.state;
        }
-       if (tp->gesture.state == GESTURE_STATE_PINCH) {
-               tp_gesture_handle_state_pinch(tp, time);
-       }
-
        if (oldstate != tp->gesture.state) {
                char buf[1024] = {0};
                size_t remaining = sizeof(buf);