efl_ui_image: fix removal of the internal evas image 81/136381/1
authorDaniel Zaoui <daniel.zaoui@yahoo.com>
Mon, 21 Nov 2016 09:52:27 +0000 (11:52 +0200)
committerJaehyun Cho <jae_hyun.cho@samsung.com>
Thu, 29 Jun 2017 08:24:41 +0000 (17:24 +0900)
During the replacement of the image with the new preloaded one,
the previous image is deleted but not removed from the list of
children of the icon (efl_ui_image), leading to Eo errors when
walking over the icon children.

@fix

Change-Id: Ic5e606bf2b485051e419b1ea0ba263cd5c7808f9

src/lib/elm_image.c

index c8b741cdce2ecc66d0d66676d16943fea997f162..6a3d0fae6145e4e8bc519b16701254173486c49a 100644 (file)
@@ -58,6 +58,15 @@ struct _Async_Open_Data {
    void             *map;
 };
 
+static void
+_prev_img_del(Elm_Image_Data *sd)
+{
+   elm_widget_sub_object_del(sd->self, sd->prev_img);
+   evas_object_smart_member_del(sd->prev_img);
+   evas_object_del(sd->prev_img);
+   sd->prev_img = NULL;
+}
+
 static void
 _on_image_preloaded(void *data,
                     Evas *e EINA_UNUSED,
@@ -69,7 +78,7 @@ _on_image_preloaded(void *data,
 
    sd->preload_status = ELM_IMAGE_PRELOADED;
    if (sd->show) evas_object_show(obj);
-   ELM_SAFE_FREE(sd->prev_img, evas_object_del);
+   _prev_img_del(sd);
    err = evas_object_image_load_error_get(obj);
    if (!err) evas_object_smart_callback_call(sd->self, SIG_LOAD_READY, NULL);
    else evas_object_smart_callback_call(sd->self, SIG_LOAD_ERROR, NULL);
@@ -417,7 +426,7 @@ _elm_image_edje_file_set(Evas_Object *obj,
 
    ELM_IMAGE_DATA_GET(obj, sd);
 
-   ELM_SAFE_FREE(sd->prev_img, evas_object_del);
+   _prev_img_del(sd);
 
    if (!sd->edje)
      {
@@ -643,7 +652,7 @@ _elm_image_evas_object_smart_show(Eo *obj, Elm_Image_Data *sd)
 
    evas_object_show(sd->img);
 
-   ELM_SAFE_FREE(sd->prev_img, evas_object_del);
+   _prev_img_del(sd);
 }
 
 EOLIAN static void
@@ -654,7 +663,7 @@ _elm_image_evas_object_smart_hide(Eo *obj, Elm_Image_Data *sd)
    sd->show = EINA_FALSE;
    evas_object_hide(sd->img);
 
-   ELM_SAFE_FREE(sd->prev_img, evas_object_del);
+   _prev_img_del(sd);
 }
 
 EOLIAN static void
@@ -793,7 +802,7 @@ _elm_image_file_set_do(Evas_Object *obj)
 
    ELM_IMAGE_DATA_GET(obj, sd);
 
-   ELM_SAFE_FREE(sd->prev_img, evas_object_del);
+   _prev_img_del(sd);
    if (sd->img)
      {
         pclip = evas_object_clip_get(sd->img);
@@ -1278,7 +1287,7 @@ _elm_image_preload_disabled_set(Eo *obj EINA_UNUSED, Elm_Image_Data *sd, Eina_Bo
           {
              evas_object_image_preload(sd->img, disable);
              if (sd->show) evas_object_show(sd->img);
-             ELM_SAFE_FREE(sd->prev_img, evas_object_del);
+             _prev_img_del(sd);
           }
         sd->preload_status = ELM_IMAGE_PRELOAD_DISABLED;
      }