feat(indev): add an indev reset event (#4539)

Signed-off-by: wangxuedong <wangxuedong@xiaomi.com>
This commit is contained in:
xaowang96
2023-09-18 04:18:04 +08:00
committed by GitHub
parent 788ba76638
commit 6fdd585549
3 changed files with 48 additions and 25 deletions

View File

@@ -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);
}
}
/**

View File

@@ -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;
}
}
}
}

View File

@@ -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 *`.*/