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);

-- 


Reply via email to