diff --git a/src/core/lv_obj_tree.c b/src/core/lv_obj_tree.c index 87c2f59685..bf37ad95ad 100644 --- a/src/core/lv_obj_tree.c +++ b/src/core/lv_obj_tree.c @@ -385,10 +385,7 @@ static void obj_del_core(lv_obj_t * obj) } /*Clean registered event_cb*/ - uint32_t event_cnt = lv_obj_get_event_count(obj); - for(uint32_t i = 0; i < event_cnt; i++) { - lv_obj_remove_event(obj, i); - } + if(obj->spec_attr) lv_event_remove_all(&(obj->spec_attr->event_list)); /*Recursively delete the children*/ lv_obj_t * child = lv_obj_get_child(obj, 0); diff --git a/src/disp/lv_disp.c b/src/disp/lv_disp.c index 7a1d036888..ddd02cda50 100644 --- a/src/disp/lv_disp.c +++ b/src/disp/lv_disp.c @@ -138,6 +138,7 @@ void lv_disp_remove(lv_disp_t * disp) if(disp == lv_disp_get_default()) was_default = true; lv_disp_send_event(disp, LV_EVENT_DELETE, NULL); + lv_event_remove_all(&(disp->event_list)); /*Detach the input devices*/ lv_indev_t * indev; diff --git a/src/misc/lv_event.c b/src/misc/lv_event.c index 0509b82693..da559dcd18 100644 --- a/src/misc/lv_event.c +++ b/src/misc/lv_event.c @@ -140,6 +140,16 @@ bool lv_event_remove(lv_event_list_t * list, uint32_t index) return true; } +void lv_event_remove_all(lv_event_list_t * list) +{ + LV_ASSERT_NULL(list); + if(list && list->dsc) { + lv_free(list->dsc); + list->dsc = NULL; + list->cnt = 0; + } +} + void * lv_event_get_current_target(lv_event_t * e) { return e->current_target; diff --git a/src/misc/lv_event.h b/src/misc/lv_event.h index 00efcb8fe9..038b094ed2 100644 --- a/src/misc/lv_event.h +++ b/src/misc/lv_event.h @@ -163,6 +163,8 @@ void * lv_event_dsc_get_user_data(lv_event_dsc_t * dsc); bool lv_event_remove(lv_event_list_t * list, uint32_t index); +void lv_event_remove_all(lv_event_list_t * list); + /** * Get the object originally targeted by the event. It's the same even if the event is bubbled. * @param e pointer to the event descriptor