Standardizing elm_<widget>_{icon,content}_set API
authorIván Briano <sachieru@gmail.com>
Wed, 16 Jun 2010 20:58:09 +0000 (20:58 +0000)
committerIván Briano <sachieru@gmail.com>
Wed, 16 Jun 2010 20:58:09 +0000 (20:58 +0000)
elm_<widget>_icon_set was changed to the better form and the signals
was passed to hidden icons when one icon is changed/removed.
Moreover, when changed by {icon,content}_set the old {icon,content}
will be deleted.

By: Fabiano Fidencio <fidencio@profusion.mobi>

SVN revision: 49706

20 files changed:
src/lib/Elementary.h.in
src/lib/elc_fileselector_button.c
src/lib/elm_bubble.c
src/lib/elm_button.c
src/lib/elm_check.c
src/lib/elm_conform.c
src/lib/elm_frame.c
src/lib/elm_hover.c
src/lib/elm_layout.c
src/lib/elm_list.c
src/lib/elm_mapbuf.c
src/lib/elm_menu.c
src/lib/elm_notify.c
src/lib/elm_panel.c
src/lib/elm_progressbar.c
src/lib/elm_radio.c
src/lib/elm_scroller.c
src/lib/elm_slider.c
src/lib/elm_toggle.c
src/lib/elm_win.c

index a132d44..b580681 100644 (file)
@@ -367,6 +367,7 @@ extern "C" {
    EAPI Evas_Object *elm_win_inwin_add(Evas_Object *obj);
    EAPI void         elm_win_inwin_activate(Evas_Object *obj);
    EAPI void         elm_win_inwin_content_set(Evas_Object *obj, Evas_Object *content);
+   EAPI Evas_Object *elm_win_inwin_content_unset(Evas_Object *obj);
    /* available styles:
     * default
     * minimal
@@ -491,6 +492,7 @@ extern "C" {
 
    EAPI Evas_Object *elm_scroller_add(Evas_Object *parent);
    EAPI void         elm_scroller_content_set(Evas_Object *obj, Evas_Object *child);
+   EAPI Evas_Object *elm_scroller_content_unset(Evas_Object *obj);
    EAPI void         elm_scroller_custom_widget_base_theme_set(Evas_Object *obj, const char *widget, const char *base);
    EAPI void         elm_scroller_content_min_limit(Evas_Object *obj, Eina_Bool w, Eina_Bool h);
    EAPI void         elm_scroller_region_show(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h);
@@ -546,6 +548,7 @@ extern "C" {
    EAPI void         elm_frame_label_set(Evas_Object *obj, const char *label);
    EAPI const char  *elm_frame_label_get(const Evas_Object *obj);
    EAPI void         elm_frame_content_set(Evas_Object *obj, Evas_Object *content);
+   EAPI Evas_Object *elm_frame_content_unset(Evas_Object *obj);
    /* available styles:
     * default
     * pad_small
@@ -644,6 +647,7 @@ extern "C" {
    EAPI Eina_Bool    elm_layout_file_set(Evas_Object *obj, const char *file, const char *group);
    EAPI Eina_Bool    elm_layout_theme_set(Evas_Object *obj, const char *clas, const char *group, const char *style);
    EAPI void         elm_layout_content_set(Evas_Object *obj, const char *swallow, Evas_Object *content);
+   EAPI Evas_Object *elm_layout_content_unset(Evas_Object *obj, const char *swallow);
    EAPI Evas_Object *elm_layout_edje_get(const Evas_Object *obj);
    EAPI void         elm_layout_sizing_eval(Evas_Object *obj);
    /* smart callbacks called:
@@ -663,6 +667,7 @@ extern "C" {
      } Elm_Notify_Orient;
    EAPI Evas_Object *elm_notify_add(Evas_Object *parent);
    EAPI void         elm_notify_content_set(Evas_Object *obj, Evas_Object *content);
+   EAPI Evas_Object *elm_notify_content_unset(Evas_Object *obj);
    EAPI void        elm_notify_parent_set(Evas_Object *obj, Evas_Object *parent);
    EAPI void        elm_notify_orient_set(Evas_Object *obj, Elm_Notify_Orient orient);
    EAPI void         elm_notify_timeout_set(Evas_Object *obj, int timeout);
@@ -684,6 +689,7 @@ extern "C" {
    EAPI void         elm_hover_parent_set(Evas_Object *obj, Evas_Object *parent);
    EAPI Evas_Object *elm_hover_parent_get(Evas_Object *obj);
    EAPI void         elm_hover_content_set(Evas_Object *obj, const char *swallow, Evas_Object *content);
+   EAPI Evas_Object *elm_hover_content_unset(Evas_Object *obj, const char *swallow);
    EAPI const char  *elm_hover_best_content_location_get(const Evas_Object *obj, Elm_Hover_Axis pref_axis);
    /* available styles:
     * default
@@ -846,6 +852,7 @@ extern "C" {
    EAPI const char  *elm_bubble_info_get(const Evas_Object *obj);
 
    EAPI void         elm_bubble_content_set(Evas_Object *obj, Evas_Object *content);
+   EAPI Evas_Object *elm_bubble_content_unset(Evas_Object *obj);
    EAPI void         elm_bubble_icon_set(Evas_Object *obj, Evas_Object *icon);
    EAPI Evas_Object *elm_bubble_icon_get(const Evas_Object *obj);
    EAPI void         elm_bubble_corner_set(Evas_Object *obj, const char *corner);
@@ -1455,6 +1462,7 @@ extern "C" {
    EAPI void                  elm_panel_orient_set(Evas_Object *obj, Elm_Panel_Orient orient);
    EAPI Elm_Panel_Orient      elm_panel_orient_get(Evas_Object *obj);
    EAPI void                  elm_panel_content_set(Evas_Object *obj, Evas_Object *content);
+   EAPI Evas_Object          *elm_panel_content_unset(Evas_Object *obj);
    EAPI void                  elm_panel_hidden_set(Evas_Object *obj, Eina_Bool hidden);
    EAPI Eina_Bool             elm_panel_hidden_get(Evas_Object *obj);
    EAPI void                  elm_panel_toggle(Evas_Object *obj);
@@ -1519,9 +1527,12 @@ extern "C" {
 
    EAPI Evas_Object *elm_conformant_add(Evas_Object *parent);
    EAPI void         elm_conformant_content_set(Evas_Object *obj, Evas_Object *content);
+   EAPI Evas_Object *elm_conformant_content_unset(Evas_Object *obj);
+
 
    EAPI Evas_Object *elm_mapbuf_add(Evas_Object *parent);
    EAPI void         elm_mapbuf_content_set(Evas_Object *obj, Evas_Object *content);
+   EAPI Evas_Object *elm_mapbuf_content_unset(Evas_Object *obj);
    EAPI void         elm_mapbuf_enabled_set(Evas_Object *obj, Eina_Bool enabled);
    EAPI Eina_Bool    elm_mapbuf_enabled_get(const Evas_Object *obj);
    EAPI void         elm_mapbuf_smooth_set(Evas_Object *obj, Eina_Bool smooth);
index d28a5b3..500f981 100644 (file)
@@ -695,6 +695,8 @@ elm_fileselector_button_inwin_mode_get(const Evas_Object *obj)
 /**
  * Set the icon used for the button
  *
+ * Once the icon object is set, a previously set one will be deleted.
+ *
  * @param obj The button object
  * @param icon  The image for the button
  *
@@ -706,21 +708,19 @@ elm_fileselector_button_icon_set(Evas_Object *obj, Evas_Object *icon)
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if ((wd->icon != icon) && (wd->icon))
-     elm_widget_sub_object_del(obj, wd->icon);
-   if ((icon) && (wd->icon != icon))
+   if (wd->icon == icon) return;
+   if (wd->icon) evas_object_del(wd->icon);
+   wd->icon = icon;
+   if (icon)
      {
-       wd->icon = icon;
        elm_widget_sub_object_add(obj, icon);
        evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
                                       _changed_size_hints, obj);
        edje_object_part_swallow(wd->btn, "elm.swallow.content", icon);
        edje_object_signal_emit(wd->btn, "elm,state,icon,visible", "elm");
        edje_object_message_signal_process(wd->btn);
-       _sizing_eval(obj);
      }
-   else
-     wd->icon = icon;
+   _sizing_eval(obj);
 }
 
 /**
index f9865bd..9721ae2 100644 (file)
@@ -209,13 +209,17 @@ elm_bubble_info_get(const Evas_Object *obj)
 }
 
 /**
- * Set the text to be showed in the bubble
+ * Set the content to be shown in the bubble
+ *
+ * Once the content object is set, a previously set one will be deleted.
+ * If you want to keep the old content object, use the
+ * elm_bubble_content_unset() function.
  *
  * @param obj The bubble object
- * @param content The given info about the bubble
+ * @param content The given content of the bubble
  *
- * This function sets the text shown on the top right of bubble. In
- * the Anchorblock example of the Elementary tests application it
+ * This function sets the content shown on the middle of the bubble.
+ * In the Anchorblock example of the Elementary tests application it
  * shows time.
  *
  * @ingroup Bubble
@@ -226,14 +230,13 @@ elm_bubble_content_set(Evas_Object *obj, Evas_Object *content)
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if ((wd->content != content) && (wd->content))
-     elm_widget_sub_object_del(obj, wd->content);
+   if (wd->content == content) return;
+   if (wd->content) evas_object_del(wd->content);
    wd->content = content;
    if (content)
      {
        elm_widget_sub_object_add(obj, content);
-       evas_object_event_callback_add(content,
-                                       EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+       evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
                                       _changed_size_hints, obj);
        edje_object_part_swallow(wd->bbl, "elm.swallow.content", content);
      }
@@ -241,13 +244,38 @@ elm_bubble_content_set(Evas_Object *obj, Evas_Object *content)
 }
 
 /**
+ * Unset the content shown in the bubble
+ *
+ * Unparent and return the content object which was set for this widget.
+ *
+ * @param obj The bubble object
+ * @return The content that was being used
+ *
+ * @ingroup Bubble
+ */
+EAPI Evas_Object *
+elm_bubble_content_unset(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *content;
+   if (!wd) return NULL;
+   if (!wd->content) return NULL;
+   content = wd->content;
+   elm_widget_sub_object_del(obj, wd->content);
+   edje_object_part_unswallow(wd->bbl, wd->content);
+   wd->content = NULL;
+   return content;
+}
+
+/**
  * Set the icon of the bubble
  *
+ * Once the icon object is set, a previously set one will be deleted.
+ *
  * @param obj The bubble object
  * @param icon The given icon for the bubble
  *
- * This function sets the icon shown on the top left of bubble.
- *
  * @ingroup Bubble
  */
 EAPI void
@@ -256,8 +284,8 @@ elm_bubble_icon_set(Evas_Object *obj, Evas_Object *icon)
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if ((wd->icon != icon) && (wd->icon))
-     elm_widget_sub_object_del(obj, wd->icon);
+   if (wd->icon == icon) return;
+   if (wd->icon) evas_object_del(wd->icon);
    wd->icon = icon;
    if (icon)
      {
@@ -267,8 +295,8 @@ elm_bubble_icon_set(Evas_Object *obj, Evas_Object *icon)
                                       _changed_size_hints, obj);
        edje_object_signal_emit(wd->bbl, "elm,state,icon,visible", "elm");
        edje_object_message_signal_process(wd->bbl);
-       _sizing_eval(obj);
      }
+   _sizing_eval(obj);
 }
 
 /**
index 3bccbef..506c2de 100644 (file)
@@ -18,7 +18,6 @@ struct _Widget_Data
 {
    Evas_Object *btn, *icon;
    const char *label;
-
    Eina_Bool autorepeat;
    Eina_Bool repeating;
    double ar_threshold;
@@ -305,8 +304,10 @@ elm_button_label_get(const Evas_Object *obj)
 /**
  * Set the icon used for the button
  *
+ * Once the icon object is set, a previously set one will be deleted
+ *
  * @param obj The button object
- * @param icon  The image for the button
+ * @param icon The image for the button
  *
  * @ingroup Button
  */
@@ -316,21 +317,19 @@ elm_button_icon_set(Evas_Object *obj, Evas_Object *icon)
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if ((wd->icon != icon) && (wd->icon))
-     elm_widget_sub_object_del(obj, wd->icon);
-   if ((icon) && (wd->icon != icon))
+   if (wd->icon == icon) return;
+   if (wd->icon) evas_object_del(wd->icon);
+   wd->icon = icon;
+   if (icon)
      {
-       wd->icon = icon;
        elm_widget_sub_object_add(obj, icon);
        evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
                                       _changed_size_hints, obj);
        edje_object_part_swallow(wd->btn, "elm.swallow.content", icon);
        edje_object_signal_emit(wd->btn, "elm,state,icon,visible", "elm");
        edje_object_message_signal_process(wd->btn);
-       _sizing_eval(obj);
      }
-   else
-     wd->icon = icon;
+   _sizing_eval(obj);
 }
 
 /**
index c91956a..188ed3f 100644 (file)
@@ -127,6 +127,7 @@ _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info)
                                        _changed_size_hints, obj);
        wd->icon = NULL;
        _sizing_eval(obj);
+       edje_object_message_signal_process(wd->chk);
      }
 }
 
@@ -256,10 +257,7 @@ elm_check_label_get(const Evas_Object *obj)
 /**
  * Set the icon object of the check object
  *
- * Once the icon object is set, it will become a child of the check object and
- * be deleted when the check object is deleted. If another icon object is set
- * then the previous one becomes orophaned and will no longer be deleted along
- * with the check.
+ * Once the icon object is set, a previously set one will be deleted.
  *
  * @param obj The check object
  * @param icon The icon object
@@ -272,8 +270,8 @@ elm_check_icon_set(Evas_Object *obj, Evas_Object *icon)
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if ((wd->icon != icon) && (wd->icon))
-     elm_widget_sub_object_del(obj, wd->icon);
+   if (wd->icon == icon) return;
+   if (wd->icon) evas_object_del(wd->icon);
    wd->icon = icon;
    if (icon)
      {
@@ -282,8 +280,9 @@ elm_check_icon_set(Evas_Object *obj, Evas_Object *icon)
                                       _changed_size_hints, obj);
        edje_object_part_swallow(wd->chk, "elm.swallow.content", icon);
        edje_object_signal_emit(wd->chk, "elm,state,icon,visible", "elm");
-       _sizing_eval(obj);
+       edje_object_message_signal_process(wd->chk);
      }
+   _sizing_eval(obj);
 }
 
 /**
index 85bceb9..03f35fa 100644 (file)
@@ -268,28 +268,56 @@ elm_conformant_add(Evas_Object *parent)
 
 /**
  * Set the content of the conformant widget
- * 
+ *
+ * Once the content object is set, a previously set one will be deleted.
+ * If you want to keep that old content object, use the
+ * elm_conformat_content_unset() function.
+ *
  * @param obj The conformant object
- * @param content The content that will be used inside this conformant object
- * 
+ * @return The content that was being used
+ *
  * @ingroup Conformant
  */
-EAPI void 
-elm_conformant_content_set(Evas_Object *obj, Evas_Object *content) 
+EAPI void
+elm_conformant_content_set(Evas_Object *obj, Evas_Object *content)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if ((wd->content != content) && (wd->content))
-     elm_widget_sub_object_del(obj, wd->content);
+   if (wd->content == content) return;
+   if (wd->content) evas_object_del(wd->content);
    wd->content = content;
-   if (content) 
+   if (content)
      {
-        elm_widget_sub_object_add(obj, content);
-        evas_object_event_callback_add(content,
-                                       EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                       _changed_size_hints, obj);
-        edje_object_part_swallow(wd->base, "elm.swallow.content", content);
-        _sizing_eval(obj);
+       elm_widget_sub_object_add(obj, content);
+       evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+                                      _changed_size_hints, obj);
+       edje_object_part_swallow(wd->base, "elm.swallow.content", content);
      }
+   _sizing_eval(obj);
+}
+
+/**
+ * Unset the content of the conformant widget
+ *
+ * Unparent and return the content object which was set for this widget;
+ *
+ * @param obj The conformant object
+ * @return The content that was being used
+ *
+ * @ingroup Conformant
+ */
+EAPI Evas_Object *
+elm_conformant_content_unset(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *content;
+   if (!wd) return NULL;
+   if (!wd->content) return NULL;
+   content = wd->content;
+   elm_widget_sub_object_del(obj, wd->content);
+   edje_object_part_unswallow(wd->base, wd->content);
+   wd->content = NULL;
+   return content;
 }
index 3acd071..19a5fe7 100644 (file)
@@ -152,7 +152,11 @@ elm_frame_label_get(const Evas_Object *obj)
 }
 
 /**
- * Set the frame content
+ * Set the content of the frame widget
+ *
+ * Once the content object is set, a previously set one will be deleted.
+ * If you want to keep that old content object, use the
+ * elm_frame_content_unset() function.
  *
  * @param obj The frame object
  * @param content The content will be filled in this frame object
@@ -165,16 +169,40 @@ elm_frame_content_set(Evas_Object *obj, Evas_Object *content)
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if ((wd->content != content) && (wd->content))
-     elm_widget_sub_object_del(obj, wd->content);
+   if (wd->content == content) return;
+   if (wd->content) evas_object_del(wd->content);
    wd->content = content;
    if (content)
      {
        elm_widget_sub_object_add(obj, content);
-       evas_object_event_callback_add(content,
-                                       EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+       evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
                                       _changed_size_hints, obj);
        edje_object_part_swallow(wd->frm, "elm.swallow.content", content);
-       _sizing_eval(obj);
      }
+   _sizing_eval(obj);
+}
+
+/**
+ * Unset the content of the frame widget
+ *
+ * Unparent and return the content object which was set for this widget
+ *
+ * @param obj The frame object
+ * @return The content that was being used
+ *
+ * @ingroup Frame
+ */
+EAPI Evas_Object *
+elm_frame_content_unset(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *content;
+   if (!wd) return NULL;
+   if (!wd->content) NULL;
+   content = wd->content;
+   elm_widget_sub_object_del(obj, wd->content);
+   edje_object_part_unswallow(wd->frm, wd->content);
+   wd->content = NULL;
+   return content;
 }
index 9e0d43c..8e4bb54 100644 (file)
@@ -426,6 +426,10 @@ elm_hover_parent_get(Evas_Object *obj)
  * Sets the content of the hover object and the direction in which
  * it will pop out.
  *
+ * Once the content object is set, a previously set one will be deleted.
+ * If you want to keep that old content object, use the
+ * elm_hover_content_unset() function.
+ *
  * @param obj The hover object
  * @param swallow The direction that the object will display in. Multiple
  * objects can have the same swallow location. Objects placed in the same
@@ -451,7 +455,8 @@ elm_hover_content_set(Evas_Object *obj, const char *swallow, Evas_Object *conten
        if (!strcmp(buf, si->swallow))
          {
             if (content == si->obj) return;
-            elm_widget_sub_object_del(obj, si->obj);
+            evas_object_del(si->obj);
+            si->obj = NULL;
             break;
          }
      }
@@ -463,8 +468,49 @@ elm_hover_content_set(Evas_Object *obj, const char *swallow, Evas_Object *conten
        si->swallow = eina_stringshare_add(buf);
        si->obj = content;
        wd->subs = eina_list_append(wd->subs, si);
-       _sizing_eval(obj);
      }
+   _sizing_eval(obj);
+}
+
+/**
+ * Unset the content of the hover object
+ *
+ * Unparent and return the content object which was set for this widget
+ *
+ * @param obj The hover object
+ * @param swallow The direction that the object will display in. Multiple
+ * objects can have the same swallow location. Objects placed in the same
+ * swallow will be placed starting at the middle of the hover and ending
+ * farther from the middle.
+ * Accepted values are "left" "right" "top" "bottom" "middle"
+ * @return The content that was being used
+ *
+ * @ingroup Hover
+ */
+EAPI Evas_Object *
+elm_hover_content_unset(Evas_Object *obj, const char *swallow)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Subinfo *si;
+   Evas_Object *content;
+   const Eina_List *l;
+   char buf[1024];
+   if (!wd) return NULL;
+   snprintf(buf, sizeof(buf), "elm.swallow.slot.%s", swallow);
+   EINA_LIST_FOREACH(wd->subs, l, si)
+     {
+       if (!strcmp(buf, si->swallow))
+         {
+            if (!si->obj) return NULL;
+            content = si->obj;
+            elm_widget_sub_object_del(obj, si->obj);
+            edje_object_part_unswallow(wd->cov, si->obj);
+            si->obj = NULL;
+            break;
+         }
+     }
+   return content;
 }
 
 /**
index 9bd273a..6e7c439 100644 (file)
@@ -211,6 +211,10 @@ elm_layout_theme_set(Evas_Object *obj, const char *clas, const char *group, cons
 /**
  * Set the layout content
  *
+ * Once the content object is set, a previously set one will be deleted.
+ * If you want to keep that old content object, use the
+ * elm_layout_content_unset() function.
+ *
  * @param obj The layout object
  * @param swallow The swallow group name in the edje file
  * @param content The content will be filled in this layout object
@@ -230,7 +234,8 @@ elm_layout_content_set(Evas_Object *obj, const char *swallow, Evas_Object *conte
        if (!strcmp(swallow, si->swallow))
          {
             if (content == si->obj) return;
-            elm_widget_sub_object_del(obj, si->obj);
+            evas_object_del(si->obj);
+            si->obj = NULL;
             break;
          }
      }
@@ -245,8 +250,43 @@ elm_layout_content_set(Evas_Object *obj, const char *swallow, Evas_Object *conte
        si->swallow = eina_stringshare_add(swallow);
        si->obj = content;
        wd->subs = eina_list_append(wd->subs, si);
-       _request_sizing_eval(obj);
      }
+   _request_sizing_eval(obj);
+}
+
+/**
+ * Unset the layout content
+ *
+ * Unparent and return the content object which was set for this widget
+ *
+ * @param obj The layout object
+ * @param swallow The swallow group name in the edje file
+ * @return The content that was being used
+ *
+ * @ingroup Layout
+ */
+EAPI Evas_Object *
+elm_layout_content_unset(Evas_Object *obj, const char *swallow)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Subinfo *si;
+   Evas_Object *content;
+   const Eina_List *l;
+   if (!wd) return NULL;
+   EINA_LIST_FOREACH(wd->subs, l, si)
+     {
+       if (!strcmp(swallow, si->swallow))
+         {
+            if (!si->obj) return NULL;
+            content == si->obj;
+            elm_widget_sub_object_del(obj, si->obj);
+            edje_object_part_unswallow(wd->lay, si->obj);
+            si->obj = NULL;
+            break;
+         }
+     }
+   return content;
 }
 
 /**
index b7844b2..40300f1 100644 (file)
@@ -1296,6 +1296,10 @@ elm_list_item_icon_get(const Elm_List_Item *it)
 /**
  * Sets the left side icon associated with the item.
  *
+ * Once the icon object is set, a previously set one will be deleted.
+ * You probably don't want, then, to have the <b>same</b> icon object set
+ * for more than one item of the list.
+ *
  * @param it The list item
  * @param icon The left side icon object to associate with @p it
  *
@@ -1307,13 +1311,22 @@ elm_list_item_icon_set(Elm_List_Item *it, Evas_Object *icon)
    ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
    if (it->icon == icon) return;
    if (it->dummy_icon && !icon) return;
-   if (it->dummy_icon) evas_object_del(it->icon);
+   if (it->dummy_icon)
+     {
+       evas_object_del(it->icon);
+       it->dummy_icon = EINA_FALSE;
+     }
    if (!icon)
      {
        icon = evas_object_rectangle_add(evas_object_evas_get(it->obj));
        evas_object_color_set(icon, 0, 0, 0, 0);
        it->dummy_icon = EINA_TRUE;
      }
+   if (it->icon)
+     {
+       evas_object_del(it->icon);
+       it->icon = NULL;
+     }
    it->icon = icon;
    if (it->base)
      edje_object_part_swallow(it->base, "elm.swallow.icon", icon);
@@ -1336,7 +1349,11 @@ elm_list_item_end_get(const Elm_List_Item *it)
 }
 
 /**
- * Gets the right side icon associated with the item.
+ * Sets the right side icon associated with the item.
+ *
+ * Once the icon object is set, a previously set one will be deleted.
+ * You probably don't want, then, to have the <b>same</b> icon object set
+ * for more than one item of the list.
  *
  * @param it The list item
  * @param icon The right side icon object to associate with @p it
@@ -1349,13 +1366,22 @@ elm_list_item_end_set(Elm_List_Item *it, Evas_Object *end)
    ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
    if (it->end == end) return;
    if (it->dummy_end && !end) return;
-   if (it->dummy_end) evas_object_del(it->end);
+   if (it->dummy_end)
+     {
+       evas_object_del(it->end);
+       it->dummy_icon = EINA_FALSE;
+     }
    if (!end)
      {
        end = evas_object_rectangle_add(evas_object_evas_get(it->obj));
        evas_object_color_set(end, 0, 0, 0, 0);
        it->dummy_end = EINA_TRUE;
      }
+   if (it->end)
+     {
+       evas_object_del(it->end);
+       it->end = NULL;
+     }
    it->end = end;
    if (it->base)
      edje_object_part_swallow(it->base, "elm.swallow.end", end);
index 023c4ae..2ddaad6 100644 (file)
@@ -175,6 +175,10 @@ elm_mapbuf_add(Evas_Object *parent)
 /**
  * Set the mapbuf front content
  *
+ * Once the content object is set, a previously set one will be deleted.
+ * If you want to keep that old content object, use the
+ * elm_mapbuf_content_unset() function.
+ *
  * @param obj The mapbuf object
  * @param content The content will be filled in this mapbuf object
  *
@@ -187,25 +191,45 @@ elm_mapbuf_content_set(Evas_Object *obj, Evas_Object *content)
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
    if (wd->content == content) return;
-   if ((wd->content != content) && (wd->content))
-     {
-        elm_widget_sub_object_del(obj, wd->content);
-        evas_object_smart_member_del(wd->content);
-     }
+   if (wd->content) evas_object_del(wd->content);
    wd->content = content;
    if (content)
      {
        elm_widget_sub_object_add(content, obj);
-        evas_object_smart_member_add(content, obj);
-       evas_object_event_callback_add(content,
-                                       EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+       evas_object_smart_member_add(content, obj);
+       evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
                                       _changed_size_hints, obj);
-       _sizing_eval(obj);
      }
+   _sizing_eval(obj);
    _configure(obj);
 }
 
 /**
+ * Unset the mapbuf front content
+ *
+ * Unparent and return the content object which was set for this widget.
+ *
+ * @param obj The mapbuf object
+ * @return The content that was being used
+ *
+ * @ingroup Mapbuf
+ */
+EAPI Evas_Object *
+elm_mapbuf_content_unset(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *content;
+   if (!wd) return NULL;
+   if (!wd->content) return NULL;
+   content = wd->content;
+   elm_widget_sub_object_del(obj, wd->content);
+   evas_object_smart_member_del(wd->content);
+   wd->content = NULL;
+   return content;
+}
+
+/**
  * Set the mapbuf enabled state
  *
  * @param obj The mapbuf object
index 85d9ca9..b86019b 100644 (file)
@@ -80,7 +80,6 @@ _del_hook(Evas_Object *obj)
             ll = eina_list_append(ll, item->items);
             if (item->del_cb) item->del_cb((void*)item->data, item->o, item);
             if (item->label) eina_stringshare_del(item->label);
-            if (item->icon) evas_object_del(item->icon);
             if (item->hv) evas_object_del(item->hv);
             if (item->location) evas_object_del(item->location);
             free(item);
@@ -597,6 +596,8 @@ elm_menu_item_label_get(Elm_Menu_Item *item)
 /**
  * Set the icon of a menu item
  *
+ * Once the icon object is set, a previously set one will be deleted.
+ *
  * @param it The menu item object.
  * @param icon The icon object to set for @p item
  *
@@ -605,24 +606,21 @@ elm_menu_item_label_get(Elm_Menu_Item *item)
 EAPI void
 elm_menu_item_icon_set(Elm_Menu_Item *item, Evas_Object *icon)
 {
-   if ((item->icon != icon) && (item->icon))
-     elm_widget_sub_object_del(item->menu, item->icon);
-   if ((icon) && (item->icon != icon))
+   if(item->icon == icon) return;
+   if (item->icon) evas_object_del(item->icon);
+   item->icon = icon;
+   if (icon)
      {
-       item->icon = icon;
        elm_widget_sub_object_add(item->menu, icon);
        evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                       _changed_size_hints, item->menu);
+                                       _changed_size_hints, item->menu);
        edje_object_part_swallow(item->o, "elm.swallow.content", icon);
        edje_object_signal_emit(item->o, "elm,state,icon,visible", "elm");
        edje_object_message_signal_process(item->o);
-       _sizing_eval(item->menu);
      }
-   else
-     item->icon = icon;
+   _sizing_eval(item->menu);
 }
 
-
 /**
  * Set the disabled state of @p item.
  *
index 1232a90..3b93895 100644 (file)
@@ -54,7 +54,6 @@ _del_hook(Evas_Object *obj)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   elm_notify_content_set(obj, NULL);
    elm_notify_parent_set(obj, NULL);
    elm_notify_repeat_events_set(obj, EINA_TRUE);
    if (wd->timer)
@@ -100,8 +99,16 @@ static void
 _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *sub = event_info;
    if (!wd) return;
-   if (event_info == wd->content) wd->content = NULL;
+   if (sub == wd->content)
+     {
+       evas_object_event_callback_del_full(sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+                                            _changed_size_hints, obj);
+       evas_object_event_callback_del_full(sub, EVAS_CALLBACK_RESIZE,
+                                            _content_resize, obj);
+       wd->content = NULL;
+     }
 }
 
 static void
@@ -279,7 +286,11 @@ elm_notify_add(Evas_Object *parent)
 }
 
 /**
- * Set the notify content
+ * Set the content of the notify widget
+ *
+ * Once the content object is set, a previously set one will be deleted.
+ * If you want to keep that old content object, use the
+ * elm_notify_content_unset() function.
  *
  * @param obj The notify object
  * @param content The content will be filled in this notify object
@@ -292,34 +303,48 @@ elm_notify_content_set(Evas_Object *obj, Evas_Object *content)
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if (wd->content)
-     {
-       evas_object_event_callback_del_full(wd->content,
-                                            EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                            _changed_size_hints, obj);
-        evas_object_event_callback_del_full(wd->content, EVAS_CALLBACK_RESIZE,
-                                            _content_resize, obj);
-       evas_object_del(wd->content);
-       wd->content = NULL;
-     }
-   
+   if (wd->content == content) return;
+   if (wd->content) evas_object_del(wd->content);
+   wd->content = content;
    if (content)
      {
        elm_widget_sub_object_add(obj, content);
-       wd->content = content;
-       evas_object_event_callback_add(content,
-                                       EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                       _changed_size_hints, obj);
+       evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+                                      _changed_size_hints, obj);
        evas_object_event_callback_add(content, EVAS_CALLBACK_RESIZE,
-                                       _content_resize, obj);
+                                      _content_resize, obj);
        edje_object_part_swallow(wd->notify, "elm.swallow.content", content);
-        
-       _sizing_eval(obj);
      }
+   _sizing_eval(obj);
    _calc(obj);
 }
 
 /**
+ * Unset the content of the notify widget
+ *
+ * Unparent and return the content object which was set for this widget
+ *
+ * @param obj The notify object
+ * @return The content that was being used
+ *
+ * @ingroup Notify
+ */
+EAPI Evas_Object *
+elm_notify_content_unset(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *content;
+   if (!wd) return NULL;
+   if (!wd->content) return NULL;
+   content = wd->content;
+   elm_widget_sub_object_del(obj, wd->content);
+   edje_object_part_unswallow(wd->notify, wd->content);
+   wd->content = NULL;
+   return content;
+}
+
+/**
  * Set the notify parent
  *
  * @param obj The notify object
index ee7b844..f06864f 100644 (file)
@@ -20,7 +20,7 @@
 typedef struct _Widget_Data Widget_Data;
 struct _Widget_Data 
 {
-   Evas_Object *scr, *bx;
+   Evas_Object *scr, *bx, *content;
    Elm_Panel_Orient orient;
    Eina_Bool hidden : 1;
 };
@@ -235,25 +235,58 @@ elm_panel_orient_get(Evas_Object *obj)
 /**
  * Set the content of the panel.
  *
+ * Once the content object is set, a previously set one will be deleted.
+ * If you want to keep that old content object, use the
+ * elm_panel_content_unset() function.
+ *
  * @param obj The panel object
  * @param content The panel content
  *
  * @ingroup Panel
  */
-EAPI void 
-elm_panel_content_set(Evas_Object *obj, Evas_Object *content) 
+EAPI void
+elm_panel_content_set(Evas_Object *obj, Evas_Object *content)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   evas_object_box_remove_all(wd->bx, EINA_TRUE);
-   if (!content) return;
-   evas_object_box_append(wd->bx, content);
-   evas_object_show(content);
+   if (wd->content == content) return;
+   if (wd->content)
+     evas_object_box_remove_all(wd->bx, EINA_TRUE);
+   wd->content = content;
+   if (content)
+     {
+       evas_object_box_append(wd->bx, wd->content);
+       evas_object_show(wd->content);
+     }
    _sizing_eval(obj);
 }
 
 /**
+ * Unset the content of the panel.
+ *
+ * Unparent and return the content object which was set for this widget.
+ *
+ * @param obj The panel object
+ * @return The content that was being used
+ *
+ * @ingroup Panel
+ */
+EAPI Evas_Object *
+elm_panel_content_unset(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *content;
+   if (!wd) return NULL;
+   if (!wd->content) return NULL;
+   content = wd->content;
+   evas_object_box_remove_all(wd->bx, EINA_FALSE);
+   wd->content = NULL;
+   return content;
+}
+
+/**
  * Set the state of the panel.
  *
  * @param obj The panel object
index d290f1d..8de8300 100644 (file)
@@ -139,6 +139,7 @@ _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info)
        evas_object_event_callback_del_full
          (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj);
        wd->icon = NULL;
+       edje_object_message_signal_process(wd->progressbar);
        _sizing_eval(obj);
      }
 }
@@ -372,10 +373,7 @@ elm_progressbar_label_get(const Evas_Object *obj)
 /**
  * Set the icon object of the progressbar object
  *
- * Once the icon object is set, it will become a child of the progressbar object and
- * be deleted when the progressbar object is deleted. If another icon object is set
- * then the previous one becomes orophaned and will no longer be deleted along
- * with the progressbar.
+ * Once the icon object is set, a previously set one will be deleted.
  *
  * @param obj The progressbar object
  * @param icon The icon object
@@ -388,8 +386,8 @@ elm_progressbar_icon_set(Evas_Object *obj, Evas_Object *icon)
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if ((wd->icon != icon) && (wd->icon))
-     elm_widget_sub_object_del(obj, wd->icon);
+   if (wd->icon == icon) return;
+   if (wd->icon) evas_object_del(wd->icon);
    wd->icon = icon;
    if (icon)
      {
@@ -398,8 +396,9 @@ elm_progressbar_icon_set(Evas_Object *obj, Evas_Object *icon)
                                       _changed_size_hints, obj);
        edje_object_part_swallow(wd->progressbar, "elm.swallow.content", icon);
        edje_object_signal_emit(wd->progressbar, "elm,state,icon,visible", "elm");
-       _sizing_eval(obj);
+       edje_object_message_signal_process(wd->progressbar);
      }
+   _sizing_eval(obj);
 }
 
 /**
index a875111..c5c878c 100644 (file)
@@ -296,10 +296,7 @@ elm_radio_label_get(const Evas_Object *obj)
 /**
  * Set the icon object of the radio object
  *
- * Once the icon object is set, it will become a child of the radio object and
- * be deleted when the radio object is deleted. If another icon object is set
- * then the previous one becomes orophaned and will no longer be deleted along
- * with the radio.
+ * Once the icon object is set, a previously set one will be deleted.
  *
  * @param obj The radio object
  * @param icon The icon object
@@ -312,8 +309,8 @@ elm_radio_icon_set(Evas_Object *obj, Evas_Object *icon)
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if ((wd->icon != icon) && (wd->icon))
-     elm_widget_sub_object_del(obj, wd->icon);
+   if (wd->icon == icon) return;
+   if (wd->icon) evas_object_del(wd->icon);
    wd->icon = icon;
    if (icon)
      {
@@ -322,8 +319,9 @@ elm_radio_icon_set(Evas_Object *obj, Evas_Object *icon)
                                       _changed_size_hints, obj);
        edje_object_part_swallow(wd->radio, "elm.swallow.content", icon);
        edje_object_signal_emit(wd->radio, "elm,state,icon,visible", "elm");
-       _sizing_eval(obj);
+       edje_object_message_signal_process(wd->radio);
      }
+   _sizing_eval(obj);
 }
 
 /**
index 9aaa111..709625e 100644 (file)
@@ -75,7 +75,6 @@ static const Evas_Smart_Cb_Description _signals[] = {
 static void
 _del_hook(Evas_Object *obj)
 {
-   
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
    free(wd);
@@ -353,9 +352,11 @@ elm_scroller_add(Evas_Object *parent)
 
 
 /**
- * Set the content object
+ * Set the content of the scroller widget (the object to be scrolled around).
  *
- * Sets the content of the scroller (the object to be scrolled around)
+ * Once the content object is set, a previously set one will be deleted.
+ * If you want to keep that old content object, use the
+ * elm_scroller_content_unset() function.
  *
  * @param obj The scroller object
  * @param content The new content object
@@ -368,8 +369,8 @@ elm_scroller_content_set(Evas_Object *obj, Evas_Object *content)
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if ((wd->content != content) && (wd->content))
-     elm_widget_sub_object_del(obj, wd->content);
+   if (wd->content == content) return;
+   if (wd->content) evas_object_del(wd->content);
    wd->content = content;
    if (content)
      {
@@ -379,8 +380,33 @@ elm_scroller_content_set(Evas_Object *obj, Evas_Object *content)
           elm_smart_scroller_child_set(wd->scr, content);
        evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
                                       _changed_size_hints, obj);
-       _sizing_eval(obj);
      }
+   _sizing_eval(obj);
+}
+
+/**
+ * Unset the content of the scroller widget
+ *
+ * Unparent and return the content object which was set for this widget
+ *
+ * @param obj The slider objecet
+ * @return The content that was being used
+ *
+ * @ingroup Scroller
+ */
+EAPI Evas_Object *
+elm_scroller_content_unset(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *content;
+   if (!wd) return NULL;
+   if (!wd->content) return NULL;
+   content = wd->content;
+   elm_widget_sub_object_del(obj, wd->content);
+   edje_object_part_unswallow(wd->scr, wd->content);
+   wd->content = NULL;
+   return content;
 }
 
 /**
@@ -389,6 +415,8 @@ elm_scroller_content_set(Evas_Object *obj, Evas_Object *content)
  * @param obj The scroller object
  * @param widget The widget name to use (default is "scroller")
  * @param base The base name to use (default is "base")
+ *
+ * @ingroup Scroller
  */
 EAPI void
 elm_scroller_custom_widget_base_theme_set(Evas_Object *obj, const char *widget, const char *base)
index 5b4693c..6fc553e 100644 (file)
@@ -160,6 +160,7 @@ _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info)
        evas_object_event_callback_del_full
          (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj);
        wd->icon = NULL;
+       edje_object_message_signal_process(wd->slider);
        _sizing_eval(obj);
      }
 }
@@ -396,10 +397,7 @@ elm_slider_label_get(const Evas_Object *obj)
 /**
  * Set the icon object of the slider object
  *
- * Once the icon object is set, it will become a child of the slider object and
- * be deleted when the slider object is deleted. If another icon object is set
- * then the previous one becomes orophaned and will no longer be deleted along
- * with the slider.
+ * Once the icon object is set, a previously set one will be deleted.
  *
  * @param obj The slider object
  * @param icon The icon object
@@ -412,8 +410,8 @@ elm_slider_icon_set(Evas_Object *obj, Evas_Object *icon)
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if ((wd->icon != icon) && (wd->icon))
-     elm_widget_sub_object_del(obj, wd->icon);
+   if (wd->icon == icon) return;
+   if (wd->icon) evas_object_del(wd->icon);
    wd->icon = icon;
    if (icon)
      {
@@ -422,8 +420,9 @@ elm_slider_icon_set(Evas_Object *obj, Evas_Object *icon)
                                       _changed_size_hints, obj);
        edje_object_part_swallow(wd->slider, "elm.swallow.content", icon);
        edje_object_signal_emit(wd->slider, "elm,state,icon,visible", "elm");
-       _sizing_eval(obj);
+       edje_object_message_signal_process(wd->slider);
      }
+   _sizing_eval(obj);
 }
 
 /**
index b057215..7c04449 100644 (file)
@@ -125,6 +125,7 @@ _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info)
        evas_object_event_callback_del_full
          (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj);
        wd->icon = NULL;
+       edje_object_message_signal_process(wd->tgl);
        _sizing_eval(obj);
      }
 }
@@ -242,6 +243,8 @@ elm_toggle_label_get(const Evas_Object *obj)
 /**
  * Sets the icon to be displayed with the toggle.
  *
+ * Once the icon object is set, a previously set one will be deleted.
+ *
  * @param obj The toggle object
  * @param icon The icon object to be displayed
  *
@@ -253,15 +256,18 @@ elm_toggle_icon_set(Evas_Object *obj, Evas_Object *icon)
    ELM_CHECK_WIDTYPE(obj, widtype);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if ((wd->icon != icon) && (wd->icon))
-     elm_widget_sub_object_del(obj, wd->icon);
+   if (wd->icon == icon) return;
+   if (wd->icon) evas_object_del(wd->icon);
    wd->icon = icon;
-   if (!icon) return;
-   elm_widget_sub_object_add(obj, icon);
-   evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                  _changed_size_hints, obj);
-   edje_object_part_swallow(wd->tgl, "elm.swallow.content", icon);
-   edje_object_signal_emit(wd->tgl, "elm,state,icon,visible", "elm");
+   if (icon)
+     {
+       elm_widget_sub_object_add(obj, icon);
+       evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+             _changed_size_hints, obj);
+       edje_object_part_swallow(wd->tgl, "elm.swallow.content", icon);
+       edje_object_signal_emit(wd->tgl, "elm,state,icon,visible", "elm");
+       edje_object_message_signal_process(wd->tgl);
+     }
    _sizing_eval(obj);
 }
 
index 72472c7..f1449e8 100644 (file)
@@ -1583,6 +1583,7 @@ static void
 _del_hook(Evas_Object *obj)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
    free(wd);
 }
 
@@ -1688,6 +1689,10 @@ elm_win_inwin_activate(Evas_Object *obj)
 /**
  * Set the content of an inwin object.
  *
+ * Once the content object is set, a previously set one will be deleted.
+ * If you want to keep that old content object, use the
+ * elm_win_inwin_content_unset() function.
+ *
  * @param obj The inwin object
  * @param content The object to set as content
  *
@@ -1699,8 +1704,8 @@ elm_win_inwin_content_set(Evas_Object *obj, Evas_Object *content)
    ELM_CHECK_WIDTYPE(obj, widtype2);
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if ((wd->content) && (wd->content != content))
-     elm_widget_sub_object_del(obj, wd->content);
+   if (wd->content == content) return;
+   if (wd->content) evas_object_del(wd->content);
    wd->content = content;
    if (content)
      {
@@ -1708,8 +1713,32 @@ elm_win_inwin_content_set(Evas_Object *obj, Evas_Object *content)
        evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
                                       _changed_size_hints, obj);
        edje_object_part_swallow(wd->frm, "elm.swallow.content", content);
-       _sizing_eval(obj);
      }
+   _sizing_eval(obj);
+}
+
+/**
+ * Unset the content of an inwin object.
+ *
+ * Unparent and return the content object which was set for this widget.
+ *
+ * @param obj The inwin object
+ * @return The content that was being used
+ *
+ * @ingroup Inwin
+ */
+EAPI Evas_Object *
+elm_win_inwin_content_unset(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype2) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+   if (!wd->content) return NULL;
+   Evas_Object *content = wd->content;
+   elm_widget_sub_object_del(obj, wd->content);
+   edje_object_part_unswallow(wd->frm, wd->content);
+   wd->content = NULL;
+   return content;
 }
 
 /* windowing spcific calls - shall we do this differently? */