From c3aa00ef90436edc1bc1d9e189dfbaca4df782f8 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 5 Dec 2024 13:09:43 +1000 Subject: [PATCH] gestures: don't handle SWIPE if we transitioned from SWIPE_START 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: --- src/evdev-mt-touchpad-gestures.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/evdev-mt-touchpad-gestures.c b/src/evdev-mt-touchpad-gestures.c index d557353b..371cc22b 100644 --- a/src/evdev-mt-touchpad-gestures.c +++ b/src/evdev-mt-touchpad-gestures.c @@ -1488,18 +1488,13 @@ 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_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 (transitions[idx - 1] != tp->gesture.state) transitions[idx++] = tp->gesture.state; } - if (tp->gesture.state == GESTURE_STATE_SWIPE_START) { - tp_gesture_handle_state_swipe_start(tp, time); + 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; } @@ -1508,15 +1503,21 @@ 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_START) { - tp_gesture_handle_state_pinch_start(tp, time); + if (tp->gesture.state == GESTURE_STATE_SWIPE_START) { + tp_gesture_handle_state_swipe_start(tp, 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 (transitions[idx - 1] != tp->gesture.state) + transitions[idx++] = tp->gesture.state; + } + if (tp->gesture.state == GESTURE_STATE_PINCH_START) { + tp_gesture_handle_state_pinch_start(tp, time); + if (transitions[idx - 1] != tp->gesture.state) + transitions[idx++] = tp->gesture.state; } - if (oldstate != tp->gesture.state) { char buf[1024] = {0}; size_t remaining = sizeof(buf);