From 6fdd5855499e169f1b57378d93786b55069b468b Mon Sep 17 00:00:00 2001 From: xaowang96 Date: Mon, 18 Sep 2023 04:18:04 +0800 Subject: [PATCH] feat(indev): add an indev reset event (#4539) Signed-off-by: wangxuedong --- src/core/lv_obj.c | 4 +++ src/indev/lv_indev.c | 68 ++++++++++++++++++++++++++++---------------- src/misc/lv_event.h | 1 + 3 files changed, 48 insertions(+), 25 deletions(-) diff --git a/src/core/lv_obj.c b/src/core/lv_obj.c index 84ea0bb41..b5076ccaf 100644 --- a/src/core/lv_obj.c +++ b/src/core/lv_obj.c @@ -649,6 +649,10 @@ static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e) else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST || code == LV_EVENT_COVER_CHECK) { lv_obj_draw(e); } + else if(code == LV_EVENT_INDEV_RESET) { + lv_obj_clear_state(obj, LV_STATE_PRESSED); + lv_obj_clear_state(obj, LV_STATE_SCROLLED); + } } /** diff --git a/src/indev/lv_indev.c b/src/indev/lv_indev.c index 3ded65f0f..acdedf1ee 100644 --- a/src/indev/lv_indev.c +++ b/src/indev/lv_indev.c @@ -71,6 +71,7 @@ static void indev_click_focus(lv_indev_t * indev); static void indev_gesture(lv_indev_t * indev); static bool indev_reset_check(lv_indev_t * indev); static void indev_read_core(lv_indev_t * indev, lv_indev_data_t * data); +static void indev_reset_core(lv_indev_t * indev, lv_obj_t * obj); /********************** * STATIC VARIABLES @@ -337,35 +338,12 @@ void * lv_indev_get_driver_data(const lv_indev_t * indev) void lv_indev_reset(lv_indev_t * indev, lv_obj_t * obj) { if(indev) { - indev->reset_query = 1; - if(indev_act == indev) indev_obj_act = NULL; - if(indev->type == LV_INDEV_TYPE_POINTER || indev->type == LV_INDEV_TYPE_KEYPAD) { - if(obj == NULL || indev->pointer.last_pressed == obj) { - indev->pointer.last_pressed = NULL; - } - if(obj == NULL || indev->pointer.act_obj == obj) { - indev->pointer.act_obj = NULL; - } - if(obj == NULL || indev->pointer.last_obj == obj) { - indev->pointer.last_obj = NULL; - } - } + indev_reset_core(indev, obj); } else { lv_indev_t * i = lv_indev_get_next(NULL); while(i) { - i->reset_query = 1; - if(i->type == LV_INDEV_TYPE_POINTER || i->type == LV_INDEV_TYPE_KEYPAD) { - if(obj == NULL || i->pointer.last_pressed == obj) { - i->pointer.last_pressed = NULL; - } - if(obj == NULL || i->pointer.act_obj == obj) { - i->pointer.act_obj = NULL; - } - if(obj == NULL || i->pointer.last_obj == obj) { - i->pointer.last_obj = NULL; - } - } + indev_reset_core(i, obj); i = lv_indev_get_next(i); } indev_obj_act = NULL; @@ -1383,3 +1361,43 @@ static bool indev_reset_check(lv_indev_t * indev) return indev->reset_query; } + +/** + * Reset the indev and send event to active obj and scroll obj + * @param indev pointer to an input device + * @param obj pointer to obj +*/ +static void indev_reset_core(lv_indev_t * indev, lv_obj_t * obj) +{ + lv_obj_t * act_obj = NULL; + lv_obj_t * scroll_obj = NULL; + + indev->reset_query = 1; + if(indev_act == indev) indev_obj_act = NULL; + if(indev->type == LV_INDEV_TYPE_POINTER || indev->type == LV_INDEV_TYPE_KEYPAD) { + if(obj == NULL || indev->pointer.last_pressed == obj) { + indev->pointer.last_pressed = NULL; + } + if(obj == NULL || indev->pointer.act_obj == obj) { + if(indev->pointer.act_obj) { + /* Avoid recursive calls */ + act_obj = indev->pointer.act_obj; + indev->pointer.act_obj = NULL; + lv_obj_send_event(act_obj, LV_EVENT_INDEV_RESET, indev); + act_obj = NULL; + } + } + if(obj == NULL || indev->pointer.last_obj == obj) { + indev->pointer.last_obj = NULL; + } + if(obj == NULL || indev->pointer.scroll_obj == obj) { + if(indev->pointer.scroll_obj) { + /* Avoid recursive calls */ + scroll_obj = indev->pointer.scroll_obj; + indev->pointer.scroll_obj = NULL; + lv_obj_send_event(scroll_obj, LV_EVENT_INDEV_RESET, indev); + scroll_obj = NULL; + } + } + } +} diff --git a/src/misc/lv_event.h b/src/misc/lv_event.h index 038b094ed..a43bc8f9e 100644 --- a/src/misc/lv_event.h +++ b/src/misc/lv_event.h @@ -62,6 +62,7 @@ typedef enum { LV_EVENT_DEFOCUSED, /**< The object is defocused*/ LV_EVENT_LEAVE, /**< The object is defocused but still selected*/ LV_EVENT_HIT_TEST, /**< Perform advanced hit-testing*/ + LV_EVENT_INDEV_RESET, /**< Indev has been reseted*/ /** Drawing events*/ LV_EVENT_COVER_CHECK, /**< Check if the object fully covers an area. The event parameter is `lv_cover_check_info_t *`.*/