diff --git a/src/core/lv_event.c b/src/core/lv_event.c index 5c4a573b43..ba48d57f21 100644 --- a/src/core/lv_event.c +++ b/src/core/lv_event.c @@ -170,7 +170,7 @@ bool lv_obj_remove_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb) int32_t i = 0; for(i = 0; i < obj->spec_attr->event_dsc_cnt; i++) { - if(obj->spec_attr->event_dsc[i].cb == event_cb) { + if(event_cb == NULL || obj->spec_attr->event_dsc[i].cb == event_cb) { /*Shift the remaining event handlers forward*/ for(; i < (obj->spec_attr->event_dsc_cnt-1); i++) { obj->spec_attr->event_dsc[i] = obj->spec_attr->event_dsc[i+1]; @@ -186,6 +186,32 @@ bool lv_obj_remove_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb) return false; } +bool lv_obj_remove_event_cb_with_user_data(lv_obj_t * obj, lv_event_cb_t event_cb, const void * user_data) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(obj->spec_attr == NULL) return false; + + int32_t i = 0; + for(i = 0; i < obj->spec_attr->event_dsc_cnt; i++) { + if((event_cb == NULL || obj->spec_attr->event_dsc[i].cb) && + obj->spec_attr->event_dsc[i].user_data == user_data) + { + /*Shift the remaining event handlers forward*/ + for(; i < (obj->spec_attr->event_dsc_cnt-1); i++) { + obj->spec_attr->event_dsc[i] = obj->spec_attr->event_dsc[i+1]; + } + obj->spec_attr->event_dsc_cnt--; + obj->spec_attr->event_dsc = lv_mem_realloc(obj->spec_attr->event_dsc, obj->spec_attr->event_dsc_cnt * sizeof(lv_event_dsc_t)); + LV_ASSERT_MALLOC(obj->spec_attr->event_dsc); + return true; + } + } + + /*No event handler found*/ + return false; +} + + bool lv_obj_remove_event_dsc(lv_obj_t * obj, struct _lv_event_dsc_t * event_dsc) { LV_ASSERT_OBJ(obj, MY_CLASS); diff --git a/src/core/lv_event.h b/src/core/lv_event.h index 7ef46d9296..71a897e62b 100644 --- a/src/core/lv_event.h +++ b/src/core/lv_event.h @@ -214,12 +214,22 @@ struct _lv_event_dsc_t * lv_obj_add_event_cb(struct _lv_obj_t * obj, lv_event_cb /** * Remove an event handler function for an object. * @param obj pointer to an object - * @param event_cb the event function to remove + * @param event_cb the event function to remove, or `NULL` to remove the the firstly added event callback * @return true if any event handlers were removed */ bool lv_obj_remove_event_cb(struct _lv_obj_t * obj, lv_event_cb_t event_cb); /** + * Remove an event handler function with a specific user_data from an object. + * @param obj pointer to an object + * @param event_cb the event function to remove, or `NULL` only `user_data` matters. + * @param user_data the user_data specified in ::lv_obj_add_event_cb + * @return true if any event handlers were removed + */ +bool lv_obj_remove_event_cb_with_user_data(struct _lv_obj_t * obj, lv_event_cb_t event_cb, const void * user_data); + +/** + * DEPRACTED because doesn't work if multiple event handlers are added to an object. * Remove an event handler function for an object. * @param obj pointer to an object * @param event_dsc pointer to an event descriptor to remove (returned by ::lv_obj_add_event_cb)