thiep pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=e625c9b8307175f68725abf067518670b36a3263
commit e625c9b8307175f68725abf067518670b36a3263 Author: Thiep Ha <thie...@gmail.com> Date: Wed Jan 17 09:22:13 2018 +0900 selection: delete callbacks when the manager is deleted If the selection manager is deleted before the drop objects are deleted, we need to remove callbacks in its destructor. Thank @herdsman for reporting this. --- src/lib/elementary/efl_selection_manager.c | 31 +++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/lib/elementary/efl_selection_manager.c b/src/lib/elementary/efl_selection_manager.c index 1acd8c2af8..6405ea3923 100644 --- a/src/lib/elementary/efl_selection_manager.c +++ b/src/lib/elementary/efl_selection_manager.c @@ -282,21 +282,17 @@ _tmpinfo_free(Tmp_Info *info) return 0; } -static void -_all_drop_targets_cbs_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *info EINA_UNUSED) +static inline void +_drop_target_cbs_del(Efl_Selection_Manager_Data *pd, Sel_Manager_Dropable *dropable, Efl_Object *obj) { - Efl_Selection_Manager_Data *pd = data; - Sel_Manager_Dropable *dropable = NULL; - - if (!pd) return; - dropable = efl_key_data_get(obj, "__elm_dropable"); if (dropable) { Drop_Format *df; while (dropable->format_list) { df = EINA_INLIST_CONTAINER_GET(dropable->format_list, Drop_Format); - efl_selection_manager_drop_target_del(pd->sel_man, obj, df->format, dropable->seat); + efl_selection_manager_drop_target_del(pd->sel_man, obj, + df->format, dropable->seat); // If drop_target_del() happened to delete dropabale, then // re-fetch it each loop to make sure it didn't dropable = efl_key_data_get(obj, "__elm_dropable"); @@ -306,6 +302,17 @@ _all_drop_targets_cbs_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, voi } static void +_all_drop_targets_cbs_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *info EINA_UNUSED) +{ + Efl_Selection_Manager_Data *pd = data; + Sel_Manager_Dropable *dropable = NULL; + + if (!pd) return; + dropable = efl_key_data_get(obj, "__elm_dropable"); + _drop_target_cbs_del(pd, dropable, obj); +} + +static void _dropable_coords_adjust(Sel_Manager_Dropable *dropable, Eina_Position2D *pos) { Ecore_Evas *ee; @@ -370,7 +377,7 @@ _drag_cancel_animate(void *data, double pos) Ecore_X_Window xdragwin = _x11_xwin_get(seat_sel->drag_win); ecore_x_window_ignore_set(xdragwin, 0); #endif - ERR("Delete drag_win"); + sel_debug("Delete drag_win"); evas_object_del(seat_sel->drag_win); seat_sel->drag_win = NULL; return ECORE_CALLBACK_CANCEL; @@ -5214,7 +5221,13 @@ static void _efl_selection_manager_efl_object_destructor(Eo *obj, Efl_Selection_Manager_Data *pd) { Sel_Manager_Seat_Selection *seat_sel; + Eina_List *l; + Sel_Manager_Dropable *dropable; + EINA_LIST_FOREACH(pd->drop_list, l, dropable) + { + _drop_target_cbs_del(pd, dropable, dropable->obj); + } #ifdef HAVE_ELEMENTARY_X ecore_event_handler_del(pd->notify_handler); ecore_event_handler_del(pd->clear_handler); --