From a15dcbeb56db765db8853261df3013ba037b17fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Costa?= Date: Mon, 26 Jan 2026 18:46:23 +0100 Subject: [PATCH] feat(indev): add api to set gesture thresholds (#9641) --- docs/src/main-modules/indev/gestures.rst | 7 ++-- src/indev/lv_indev.c | 41 ++++++++++++++++-------- src/indev/lv_indev.h | 21 ++++++++++++ src/indev/lv_indev_gesture.c | 2 +- src/indev/lv_indev_private.h | 6 ++-- 5 files changed, 58 insertions(+), 19 deletions(-) diff --git a/docs/src/main-modules/indev/gestures.rst b/docs/src/main-modules/indev/gestures.rst index 134c0f15e5..121ec31b16 100644 --- a/docs/src/main-modules/indev/gestures.rst +++ b/docs/src/main-modules/indev/gestures.rst @@ -59,11 +59,14 @@ Simple gestures are always enabled and very easy to use: To trigger a gesture, two things need to happen. The movement needs to be: 1. fast enough: the difference between the current and the previous point must be - greater than ``indev->gesture_min_velocity`` + greater than Indev's ``gesture_min_velocity`` 2. large enough: the difference between the first and the current point must be - greater than ``indev->gesture_limit`` + greater than Indev's ``gesture_min_distance`` +These limits can be set via :cpp:func:`lv_indev_set_gesture_min_velocity` and +:cpp:func:`lv_indev_set_gesture_min_distance` accordingly. + Multi-touch Gestures ******************** diff --git a/src/indev/lv_indev.c b/src/indev/lv_indev.c index a1eda7e72c..f64bff2ac5 100644 --- a/src/indev/lv_indev.c +++ b/src/indev/lv_indev.c @@ -131,17 +131,17 @@ lv_indev_t * lv_indev_create(void) indev->read_timer = lv_timer_create(lv_indev_read_timer_cb, LV_DEF_REFR_PERIOD, indev); - indev->disp = lv_display_get_default(); - indev->type = LV_INDEV_TYPE_NONE; - indev->mode = LV_INDEV_MODE_TIMER; - indev->scroll_limit = LV_INDEV_DEF_SCROLL_LIMIT; - indev->scroll_throw = LV_INDEV_DEF_SCROLL_THROW; - indev->long_press_time = LV_INDEV_DEF_LONG_PRESS_TIME; - indev->long_press_repeat_time = LV_INDEV_DEF_LONG_PRESS_REP_TIME; - indev->gesture_limit = LV_INDEV_DEF_GESTURE_LIMIT; - indev->gesture_min_velocity = LV_INDEV_DEF_GESTURE_MIN_VELOCITY; - indev->rotary_sensitivity = LV_INDEV_DEF_ROTARY_SENSITIVITY; - indev->key_remap_cb = NULL; + indev->disp = lv_display_get_default(); + indev->type = LV_INDEV_TYPE_NONE; + indev->mode = LV_INDEV_MODE_TIMER; + indev->scroll_limit = LV_INDEV_DEF_SCROLL_LIMIT; + indev->scroll_throw = LV_INDEV_DEF_SCROLL_THROW; + indev->long_press_time = LV_INDEV_DEF_LONG_PRESS_TIME; + indev->long_press_repeat_time = LV_INDEV_DEF_LONG_PRESS_REP_TIME; + indev->gesture_min_distance = LV_INDEV_DEF_GESTURE_LIMIT; + indev->gesture_min_velocity = LV_INDEV_DEF_GESTURE_MIN_VELOCITY; + indev->rotary_sensitivity = LV_INDEV_DEF_ROTARY_SENSITIVITY; + indev->key_remap_cb = NULL; #if LV_USE_EXT_DATA indev->ext_data.free_cb = NULL; indev->ext_data.data = NULL; @@ -414,6 +414,21 @@ void lv_indev_set_scroll_throw(lv_indev_t * indev, uint8_t scroll_throw) indev->scroll_throw = scroll_throw; } +void lv_indev_set_gesture_min_distance(lv_indev_t * indev, uint8_t min_distance) +{ + + if(indev == NULL) return; + + indev->gesture_min_distance = min_distance; +} + +void lv_indev_set_gesture_min_velocity(lv_indev_t * indev, uint8_t gesture_min_velocity) +{ + if(indev == NULL) return; + + indev->gesture_min_velocity = gesture_min_velocity; +} + void * lv_indev_get_user_data(const lv_indev_t * indev) { if(indev == NULL) return NULL; @@ -1769,8 +1784,8 @@ void indev_gesture(lv_indev_t * indev) indev->pointer.gesture_sum.x += indev->pointer.vect.x; indev->pointer.gesture_sum.y += indev->pointer.vect.y; - if((LV_ABS(indev->pointer.gesture_sum.x) > indev_act->gesture_limit) || - (LV_ABS(indev->pointer.gesture_sum.y) > indev_act->gesture_limit)) { + if((LV_ABS(indev->pointer.gesture_sum.x) > indev_act->gesture_min_distance) || + (LV_ABS(indev->pointer.gesture_sum.y) > indev_act->gesture_min_distance)) { indev->pointer.gesture_sent = 1; diff --git a/src/indev/lv_indev.h b/src/indev/lv_indev.h index a4ab173f69..2ea9736fe9 100644 --- a/src/indev/lv_indev.h +++ b/src/indev/lv_indev.h @@ -193,6 +193,27 @@ void lv_indev_set_scroll_limit(lv_indev_t * indev, uint8_t scroll_limit); */ void lv_indev_set_scroll_throw(lv_indev_t * indev, uint8_t scroll_throw); +/** + * Set the minimum velocity threshold for gesture detection. + * The difference between consecutive points must exceed this value (in pixels) + * for the movement to be considered fast enough to trigger a gesture. + * + * @param indev pointer to an input device + * @param min_velocity minimum velocity threshold in pixels (default: 3) + */ +void lv_indev_set_gesture_min_velocity(lv_indev_t * indev, uint8_t min_velocity); + +/** + * Set the minimum distance threshold for gesture detection. + * The total distance from the first point to the current point must exceed + * this value (in pixels) for the movement to be considered large enough + * to trigger a gesture. + * + * @param indev pointer to an input device + * @param min_distance minimum distance threshold in pixels (default: 50) + */ +void lv_indev_set_gesture_min_distance(lv_indev_t * indev, uint8_t min_distance); + /** * Get the type of an input device * @param indev pointer to an input device diff --git a/src/indev/lv_indev_gesture.c b/src/indev/lv_indev_gesture.c index 29f3ff0bb3..10e8140358 100644 --- a/src/indev/lv_indev_gesture.c +++ b/src/indev/lv_indev_gesture.c @@ -492,7 +492,7 @@ void lv_indev_gesture_detect_two_fingers_swipe(lv_indev_gesture_recognizer_t * r to be higher than the threshold to pass it as recognized */ gesture_calculate_factors(r->info, 2); dist = SQUARE_SUM(r->info->delta_x, r->info->delta_y); - if(dist > SQUARE(lv_indev_active()->gesture_limit)) { + if(dist > SQUARE(lv_indev_active()->gesture_min_distance)) { r->state = LV_INDEV_GESTURE_STATE_RECOGNIZED; } break; diff --git a/src/indev/lv_indev_private.h b/src/indev/lv_indev_private.h index bbc26727f5..9a1bf6d9cd 100644 --- a/src/indev/lv_indev_private.h +++ b/src/indev/lv_indev_private.h @@ -71,11 +71,11 @@ struct _lv_indev_t { /**< Drag throw slow-down in [%]. Greater value means faster slow-down*/ uint8_t scroll_throw; - /**< At least this difference should be between two points to evaluate as gesture*/ + /**< Minimum velocity: difference between consecutive points must exceed this (in pixels) to detect gesture speed */ uint8_t gesture_min_velocity; - /**< At least this difference should be to send a gesture*/ - uint8_t gesture_limit; + /**< Minimum distance: total travel from first to current point must exceed this (in pixels) to trigger gesture */ + uint8_t gesture_min_distance; /**< Long press time in milliseconds*/ uint16_t long_press_time;