discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=1861f474e4c783fee9f9a3d50764891a67bfc3a5

commit 1861f474e4c783fee9f9a3d50764891a67bfc3a5
Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Jan 27 10:52:32 2017 -0500

    remove gadget drop object event callbacks during object deletion
    
    ensure that no callbacks reference gadget internals after they have been
    deleted
---
 src/bin/e_gadget.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/src/bin/e_gadget.c b/src/bin/e_gadget.c
index ebd1a6c..c24fbf0 100644
--- a/src/bin/e_gadget.c
+++ b/src/bin/e_gadget.c
@@ -123,6 +123,7 @@ static E_Config_DD *edd_gadget;
 static void _gadget_object_finalize(E_Gadget_Config *zgc);
 static Eina_Bool _gadget_object_create(E_Gadget_Config *zgc);
 static void _editor_pointer_site_init(E_Gadget_Site_Orient orient, Evas_Object 
*site, Evas_Object *editor, Eina_Bool );
+static void _gadget_drop_handler_moveresize(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj, void *event_info EINA_UNUSED);
 
 static void
 _comp_site_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
@@ -297,6 +298,20 @@ _gadget_object_free(E_Object *eobj)
      }
    zgc->gadget = NULL;
 
+   if (zgc->drop_handlers)
+     {
+        Evas_Object *drop_object;
+        Eina_Iterator *it = eina_hash_iterator_key_new(zgc->drop_handlers);
+
+        EINA_ITERATOR_FOREACH(it, drop_object)
+          {
+             evas_object_event_callback_del(drop_object, EVAS_CALLBACK_MOVE, 
_gadget_drop_handler_moveresize);
+             evas_object_event_callback_del(drop_object, EVAS_CALLBACK_RESIZE, 
_gadget_drop_handler_moveresize);
+             evas_object_event_callback_del(drop_object, EVAS_CALLBACK_DEL, 
_gadget_drop_handler_del);
+          }
+        eina_iterator_free(it);
+     }
+
    E_FREE_FUNC(zgc->drop_handlers, eina_hash_free);
    E_FREE_FUNC(zgc->gadget, evas_object_del);
    E_FREE_FUNC(zgc->cfg_object, evas_object_del);

-- 


Reply via email to