From 94f0b8eaa053743df1d4f591e7e33f7064619137 Mon Sep 17 00:00:00 2001 From: bjsylvia Date: Wed, 20 Dec 2023 16:35:14 +0800 Subject: [PATCH] feat(indev): add lv_indev_set_mode to switch input device's event model (#4949) Signed-off-by: YanXiaowei Co-authored-by: YanXiaowei --- src/dev/nuttx/lv_nuttx_libuv.c | 5 +---- src/dev/sdl/lv_sdl_keyboard.c | 2 +- src/dev/sdl/lv_sdl_mouse.c | 2 +- src/dev/sdl/lv_sdl_mousewheel.c | 2 +- src/indev/lv_indev.c | 29 ++++++++++++++++++++++++----- src/indev/lv_indev.h | 15 ++++++++++----- src/indev/lv_indev_private.h | 1 + 7 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/dev/nuttx/lv_nuttx_libuv.c b/src/dev/nuttx/lv_nuttx_libuv.c index d3126cd5f..f69eda3bd 100644 --- a/src/dev/nuttx/lv_nuttx_libuv.c +++ b/src/dev/nuttx/lv_nuttx_libuv.c @@ -276,10 +276,7 @@ static int lv_nuttx_uv_input_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_input_ctx return 0; } - /* Remove default indev timer. */ - - lv_timer_del(indev->read_timer); - indev->read_timer = NULL; + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); input_ctx->input_poll.data = indev; uv_poll_init(loop, &input_ctx->input_poll, input_ctx->fd); diff --git a/src/dev/sdl/lv_sdl_keyboard.c b/src/dev/sdl/lv_sdl_keyboard.c index c3376115a..f61784a01 100644 --- a/src/dev/sdl/lv_sdl_keyboard.c +++ b/src/dev/sdl/lv_sdl_keyboard.c @@ -57,7 +57,7 @@ lv_indev_t * lv_sdl_keyboard_create(void) lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD); lv_indev_set_read_cb(indev, sdl_keyboard_read); lv_indev_set_driver_data(indev, dsc); - lv_indev_delete_read_timer(indev); + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); lv_indev_add_event_cb(indev, release_indev_cb, LV_EVENT_DELETE, indev); return indev; diff --git a/src/dev/sdl/lv_sdl_mouse.c b/src/dev/sdl/lv_sdl_mouse.c index a886948d1..c671702ac 100644 --- a/src/dev/sdl/lv_sdl_mouse.c +++ b/src/dev/sdl/lv_sdl_mouse.c @@ -58,7 +58,7 @@ lv_indev_t * lv_sdl_mouse_create(void) lv_indev_set_read_cb(indev, sdl_mouse_read); lv_indev_set_driver_data(indev, dsc); - lv_indev_delete_read_timer(indev); + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); lv_indev_add_event_cb(indev, release_indev_cb, LV_EVENT_DELETE, indev); return indev; diff --git a/src/dev/sdl/lv_sdl_mousewheel.c b/src/dev/sdl/lv_sdl_mousewheel.c index 622900eae..d751b4e7b 100644 --- a/src/dev/sdl/lv_sdl_mousewheel.c +++ b/src/dev/sdl/lv_sdl_mousewheel.c @@ -53,7 +53,7 @@ lv_indev_t * lv_sdl_mousewheel_create(void) lv_indev_set_read_cb(indev, sdl_mousewheel_read); lv_indev_set_driver_data(indev, dsc); - lv_indev_delete_read_timer(indev); + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); lv_indev_add_event_cb(indev, release_indev_cb, LV_EVENT_DELETE, indev); return indev; diff --git a/src/indev/lv_indev.c b/src/indev/lv_indev.c index f5072b40c..8d1ab7e6e 100644 --- a/src/indev/lv_indev.c +++ b/src/indev/lv_indev.c @@ -121,6 +121,7 @@ lv_indev_t * lv_indev_create(void) 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; @@ -486,11 +487,21 @@ lv_timer_t * lv_indev_get_read_timer(lv_indev_t * indev) return indev->read_timer; } -void lv_indev_delete_read_timer(lv_indev_t * indev) +void lv_indev_set_mode(lv_indev_t * indev, lv_indev_mode_t mode) { - if(indev && indev->read_timer) { - lv_timer_delete(indev->read_timer); - indev->read_timer = NULL; + if(!indev || indev->mode == mode) + return; + + indev->mode = mode; + if(indev->read_timer) { + if(mode == LV_INDEV_MODE_EVENT) { + lv_timer_pause(indev->read_timer); + } + else if(mode == LV_INDEV_MODE_TIMER) { + /* use default timer mode*/ + lv_timer_set_cb(indev->read_timer, lv_indev_read_timer_cb); + lv_timer_resume(indev->read_timer); + } } } @@ -1170,6 +1181,10 @@ static void indev_proc_press(lv_indev_t * indev) indev_gesture(indev); if(indev_reset_check(indev)) return; + if(indev->mode == LV_INDEV_MODE_EVENT && indev->read_timer && lv_timer_get_paused(indev->read_timer)) { + lv_timer_resume(indev->read_timer); + } + /*If there is no scrolling then check for long press time*/ if(indev->pointer.scroll_obj == NULL && indev->long_pr_sent == 0) { /*Send a long press event if enough time elapsed*/ @@ -1215,6 +1230,10 @@ static void indev_proc_release(lv_indev_t * indev) indev_obj_act = indev->pointer.act_obj; lv_obj_t * scroll_obj = indev->pointer.scroll_obj; + if(indev->mode == LV_INDEV_MODE_EVENT && indev->read_timer && !lv_timer_get_paused(indev->read_timer)) { + lv_timer_pause(indev->read_timer); + } + if(indev_obj_act) { LV_LOG_INFO("released"); @@ -1393,7 +1412,6 @@ static void indev_click_focus(lv_indev_t * indev) */ void indev_gesture(lv_indev_t * indev) { - if(indev->pointer.scroll_obj) return; if(indev->pointer.gesture_sent) return; @@ -1555,3 +1573,4 @@ static void indev_scroll_throw_anim_start(lv_indev_t * indev) indev->scroll_throw_anim = lv_anim_start(&a); } + diff --git a/src/indev/lv_indev.h b/src/indev/lv_indev.h index 51a53ad68..7425eb0e3 100644 --- a/src/indev/lv_indev.h +++ b/src/indev/lv_indev.h @@ -47,6 +47,11 @@ typedef enum { LV_INDEV_STATE_PRESSED } lv_indev_state_t; +typedef enum { + LV_INDEV_MODE_TIMER = 0, + LV_INDEV_MODE_EVENT = 1 +} lv_indev_mode_t; + /** Data structure passed to an input driver to fill*/ typedef struct { lv_point_t point; /**< For LV_INDEV_TYPE_POINTER the currently pressed point*/ @@ -242,11 +247,11 @@ struct _lv_obj_t * lv_indev_get_active_obj(void); lv_timer_t * lv_indev_get_read_timer(lv_indev_t * indev); /** - * Delete the read timer associates to indev. This is typically used when - * indev works in event driven mode instead of polling mode. - * @param indev pointer to an input device - */ -void lv_indev_delete_read_timer(lv_indev_t * indev); +* Set the input device's event model: event-driven mode or timer mode. +* @param indev pointer to an input device +* @param mode the mode of input device +*/ +void lv_indev_set_mode(lv_indev_t * indev, lv_indev_mode_t mode); /** * Search the most top, clickable object by a point diff --git a/src/indev/lv_indev_private.h b/src/indev/lv_indev_private.h index 4f7ea2ae0..415293acf 100644 --- a/src/indev/lv_indev_private.h +++ b/src/indev/lv_indev_private.h @@ -34,6 +34,7 @@ struct _lv_indev_t { lv_indev_read_cb_t read_cb; lv_indev_state_t state; /**< Current state of the input device.*/ + lv_indev_mode_t mode; /*Flags*/ uint8_t long_pr_sent : 1;