elm_win: handle icon object lifetimes more accurately, use icon_name in csd icon 46/75746/2 accepted/tizen/common/20160621.184706 accepted/tizen/ivi/20160622.021051 accepted/tizen/mobile/20160622.020944 accepted/tizen/tv/20160622.021008 accepted/tizen/wearable/20160622.021031 submit/tizen/20160621.113431
authorJinsol Park <jin_sol.park@samsung.com>
Tue, 21 Jun 2016 08:16:00 +0000 (17:16 +0900)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Tue, 21 Jun 2016 10:56:52 +0000 (03:56 -0700)
in the case where an icon existed upon having an icon object set, the previous icon
object would be orphaned while still being visible. the new icon would then never
be set into the csd.

@fix

efl opensource patch - 6a1c46613687a358b5a11a129beb66374439e1b4

Change-Id: I87d4b0ff76b6329e84a31529a2f56aeba29f6a7c

src/lib/elm_win.c

index 91383bf..1cc759c 100644 (file)
@@ -3323,17 +3323,25 @@ _elm_win_frame_add(Elm_Win_Data *sd,
 
    evas_object_is_frame_object_set(sd->frame_obj, EINA_TRUE);
 
-   if (!sd->icon)
+   if (sd->icon)
+     evas_object_show(sd->icon);
+   else
      {
-        Efreet_Desktop *d;
+        Eina_Bool set = EINA_FALSE;
 
         sd->icon = elm_icon_add(sd->obj);
 
-        d = efreet_util_desktop_exec_find(_elm_appname);
-        if (d)
+        if (sd->icon_name)
+          set = elm_icon_standard_set(sd->icon, sd->icon_name);
+        if ((!sd->icon_name) || (!set))
           {
-             elm_icon_standard_set(sd->icon, d->icon);
-             efreet_desktop_free(d);
+             Efreet_Desktop *d;
+             d = efreet_util_desktop_exec_find(_elm_appname);
+             if (d)
+               {
+                  elm_icon_standard_set(sd->icon, d->icon);
+                  efreet_desktop_free(d);
+               }
           }
      }
 
@@ -3439,6 +3447,7 @@ _elm_win_frame_del(Elm_Win_Data *sd)
 
         ELM_SAFE_FREE(sd->frame_obj, evas_object_del);
      }
+   if (sd->icon) evas_object_hide(sd->icon);
 
    evas_output_framespace_set(sd->evas, 0, 0, 0, 0);
    ecore_evas_geometry_get(sd->ee, NULL, NULL, &w, &h);
@@ -4585,12 +4594,17 @@ EOLIAN static void
 _elm_win_icon_object_set(Eo *obj, Elm_Win_Data *sd, Evas_Object *icon)
 {
    if (sd->icon)
-     evas_object_event_callback_del_full
-       (sd->icon, EVAS_CALLBACK_DEL, _elm_win_on_icon_del, obj);
+     evas_object_event_callback_del_full(sd->icon, EVAS_CALLBACK_DEL,
+       _elm_win_on_icon_del, obj);
+   evas_object_del(sd->icon);
    sd->icon = icon;
    if (sd->icon)
-     evas_object_event_callback_add
-       (sd->icon, EVAS_CALLBACK_DEL, _elm_win_on_icon_del, obj);
+     {
+        evas_object_event_callback_add(sd->icon, EVAS_CALLBACK_DEL,
+          _elm_win_on_icon_del, obj);
+        if (sd->frame_obj)
+          edje_object_part_swallow(sd->frame_obj, "elm.swallow.icon", sd->icon);
+     }
 #ifdef HAVE_ELEMENTARY_X
    _elm_win_xwin_update(sd);
 #endif