feat(indev): add an indev reset event (#4539)
Signed-off-by: wangxuedong <wangxuedong@xiaomi.com>
This commit is contained in:
@@ -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) {
|
else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST || code == LV_EVENT_COVER_CHECK) {
|
||||||
lv_obj_draw(e);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ static void indev_click_focus(lv_indev_t * indev);
|
|||||||
static void indev_gesture(lv_indev_t * indev);
|
static void indev_gesture(lv_indev_t * indev);
|
||||||
static bool indev_reset_check(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_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
|
* 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)
|
void lv_indev_reset(lv_indev_t * indev, lv_obj_t * obj)
|
||||||
{
|
{
|
||||||
if(indev) {
|
if(indev) {
|
||||||
indev->reset_query = 1;
|
indev_reset_core(indev, obj);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
lv_indev_t * i = lv_indev_get_next(NULL);
|
lv_indev_t * i = lv_indev_get_next(NULL);
|
||||||
while(i) {
|
while(i) {
|
||||||
i->reset_query = 1;
|
indev_reset_core(i, obj);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i = lv_indev_get_next(i);
|
i = lv_indev_get_next(i);
|
||||||
}
|
}
|
||||||
indev_obj_act = NULL;
|
indev_obj_act = NULL;
|
||||||
@@ -1383,3 +1361,43 @@ static bool indev_reset_check(lv_indev_t * indev)
|
|||||||
|
|
||||||
return indev->reset_query;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ typedef enum {
|
|||||||
LV_EVENT_DEFOCUSED, /**< The object is defocused*/
|
LV_EVENT_DEFOCUSED, /**< The object is defocused*/
|
||||||
LV_EVENT_LEAVE, /**< The object is defocused but still selected*/
|
LV_EVENT_LEAVE, /**< The object is defocused but still selected*/
|
||||||
LV_EVENT_HIT_TEST, /**< Perform advanced hit-testing*/
|
LV_EVENT_HIT_TEST, /**< Perform advanced hit-testing*/
|
||||||
|
LV_EVENT_INDEV_RESET, /**< Indev has been reseted*/
|
||||||
|
|
||||||
/** Drawing events*/
|
/** Drawing events*/
|
||||||
LV_EVENT_COVER_CHECK, /**< Check if the object fully covers an area. The event parameter is `lv_cover_check_info_t *`.*/
|
LV_EVENT_COVER_CHECK, /**< Check if the object fully covers an area. The event parameter is `lv_cover_check_info_t *`.*/
|
||||||
|
|||||||
Reference in New Issue
Block a user