[Icon/Layout] Clean-up signal callbacks when signal is freed or layout is deleted...
authorTae-Hwan Kim <the81.kim@samsung.com>
Fri, 7 Feb 2014 09:06:05 +0000 (18:06 +0900)
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>
Fri, 7 Feb 2014 09:06:06 +0000 (18:06 +0900)
Reviewers: raster, cedric, seoz, Hermet

Reviewed By: raster

Differential Revision: https://phab.enlightenment.org/D509

legacy/elementary/src/lib/elm_icon.c
legacy/elementary/src/lib/elm_layout.c

index 53663c5..d45dc64 100644 (file)
@@ -339,12 +339,27 @@ _elm_icon_smart_sizing_eval(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
 }
 
 static void
+_edje_signal_callback(void *data,
+                      Evas_Object *obj EINA_UNUSED,
+                      const char *emission,
+                      const char *source)
+{
+   Edje_Signal_Data *esd = data;
+
+   esd->func(esd->data, esd->obj, emission, source);
+}
+
+static void
 _edje_signals_free(Elm_Icon_Smart_Data *sd)
 {
    Edje_Signal_Data *esd;
+   Elm_Image_Smart_Data *id = eo_data_scope_get(sd->obj, ELM_OBJ_IMAGE_CLASS);
 
    EINA_LIST_FREE(sd->edje_signals, esd)
      {
+        edje_object_signal_callback_del_full
+           (id->img, esd->emission, esd->source,
+            _edje_signal_callback, esd);
         eina_stringshare_del(esd->emission);
         eina_stringshare_del(esd->source);
         free(esd);
@@ -622,17 +637,6 @@ _elm_icon_signal_emit(Evas_Object *obj,
    edje_object_signal_emit(id->img, emission, source);
 }
 
-static void
-_edje_signal_callback(void *data,
-                      Evas_Object *obj EINA_UNUSED,
-                      const char *emission,
-                      const char *source)
-{
-   Edje_Signal_Data *esd = data;
-
-   esd->func(esd->data, esd->obj, emission, source);
-}
-
 /* WARNING: to be deprecated */
 void
 _elm_icon_signal_callback_add(Evas_Object *obj,
index 7aa68f3..515790e 100644 (file)
@@ -812,6 +812,9 @@ _elm_layout_smart_del(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
 
    EINA_LIST_FREE(sd->edje_signals, esd)
      {
+        edje_object_signal_callback_del_full
+           (wd->resize_obj, esd->emission, esd->source,
+            _edje_signal_callback, esd);
         eina_stringshare_del(esd->emission);
         eina_stringshare_del(esd->source);
         free(esd);