jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=c31a70a4f58f1fd796ea32c23204b9ae7ee8b6b2

commit c31a70a4f58f1fd796ea32c23204b9ae7ee8b6b2
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Thu Nov 17 17:46:14 2016 +0900

    win: Add content_set API for window main content
    
    The idea is to not have resize object in a stack anymore,
    but a couple of swallows in the frame and if the stack of
    resize objects is wanted, then the user can still explicitely
    create it.
---
 src/bin/elementary/test_win_dialog.c |  38 +++-
 src/lib/elementary/efl_ui_win.c      | 418 +++++++++++++++++------------------
 src/lib/elementary/efl_ui_win.eo     |  10 +-
 3 files changed, 237 insertions(+), 229 deletions(-)

diff --git a/src/bin/elementary/test_win_dialog.c 
b/src/bin/elementary/test_win_dialog.c
index aa155b1..448fb9e 100644
--- a/src/bin/elementary/test_win_dialog.c
+++ b/src/bin/elementary/test_win_dialog.c
@@ -5,7 +5,7 @@
 
 
 
-void
+static void
 _bt_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
 {
    Evas_Object *dia, *lb;
@@ -24,6 +24,34 @@ _bt_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, 
void *event_info EINA_U
    evas_object_show(dia);
 }
 
+static void
+_bt2_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
+{
+   Efl_Canvas_Object *dia, *lb, *parent = data;
+
+   dia = efl_add(EFL_UI_WIN_STANDARD_CLASS, parent,
+                 efl_ui_win_type_set(efl_added, EFL_UI_WIN_DIALOG_BASIC),
+                 efl_ui_win_name_set(efl_added, "window-dia-2"),
+                 efl_ui_win_autodel_set(efl_added, EINA_TRUE),
+                 efl_text_set(efl_added, "A Fixed Size Dialog"));
+
+   // Notes:
+   // - All objects have 0 weight, this makes the window not resizable.
+   // - With EO APIs, efl_gfx_size_hint_min_set() is safe to call as EFL will
+   //   only set the restricted min size (and combine them for calculation).
+
+   lb = efl_add(EFL_UI_TEXT_CLASS, dia,
+                efl_text_set(efl_added, "This is a non-resizable dialog."),
+                efl_gfx_size_hint_min_set(efl_added, 200, 150),
+                efl_gfx_size_hint_max_set(efl_added, 200, 150),
+                efl_gfx_size_hint_weight_set(efl_added, 0, 0));
+
+   // Swallow in the label as the default content, this will make it visible.
+   efl_content_set(dia, lb);
+
+   efl_gfx_visible_set(dia, EINA_TRUE);
+}
+
 void
 test_win_dialog(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
 {
@@ -36,13 +64,19 @@ test_win_dialog(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *even
    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    elm_win_resize_object_add(win, box);
    evas_object_show(box);
-   
+
    bt = elm_button_add(win);
    elm_object_text_set(bt, "Create a new dialog");
    evas_object_smart_callback_add(bt, "clicked", _bt_clicked_cb, win);
    elm_box_pack_end(box, bt);
    evas_object_show(bt);
 
+   bt = elm_button_add(win);
+   elm_object_text_set(bt, "Create a new unresizable dialog");
+   evas_object_smart_callback_add(bt, "clicked", _bt2_clicked_cb, win);
+   elm_box_pack_end(box, bt);
+   evas_object_show(bt);
+
    evas_object_resize(win, 400, 400);
    evas_object_show(win);
 }
diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c
index 933c45c..70f93d4 100644
--- a/src/lib/elementary/efl_ui_win.c
+++ b/src/lib/elementary/efl_ui_win.c
@@ -66,7 +66,7 @@ static const Elm_Win_Trap *trap = NULL;
          }                                                      \
        if (cursd->modal_count == 0)                             \
          {                                                      \
-            edje_object_signal_emit(cursd->edje, \
+            edje_object_signal_emit(cursd->legacy.edje, \
                         "elm,action,hide_blocker", "elm");      \
             efl_event_callback_legacy_call(cursd->main_menu, 
ELM_MENU_EVENT_ELM_ACTION_UNBLOCK_MENU, NULL); \
          }                                                      \
@@ -82,7 +82,7 @@ static const Elm_Win_Trap *trap = NULL;
          }                                                      \
        if (cursd->modal_count > 0)                              \
          {                                                      \
-            edje_object_signal_emit(cursd->edje, \
+            edje_object_signal_emit(cursd->legacy.edje, \
                              "elm,action,show_blocker", "elm"); \
             efl_event_callback_legacy_call(cursd->main_menu, 
EFL_UI_WIN_EVENT_ELM_ACTION_BLOCK_MENU, NULL); \
          }                                                      \
@@ -91,7 +91,6 @@ static const Elm_Win_Trap *trap = NULL;
 #define ENGINE_GET() (_elm_preferred_engine ? _elm_preferred_engine : 
_elm_config->engine)
 
 typedef struct _Efl_Ui_Win_Data Efl_Ui_Win_Data;
-typedef struct _Box_Item_Iterator Box_Item_Iterator;
 typedef struct _Input_Pointer_Iterator Input_Pointer_Iterator;
 
 struct _Efl_Ui_Win_Data
@@ -100,9 +99,7 @@ struct _Efl_Ui_Win_Data
    Evas                 *evas;
    Evas_Object          *parent; /* parent *window* object*/
    Evas_Object          *img_obj, *frame_obj;
-   Eo                   *edje; /**< edje object for a window layout */
-   Eo                   *box;
-   Eo /* wref */        *bg;
+   Eo /* wref */        *bg, *content;
    Evas_Object          *obj; /* The object itself */
 #ifdef HAVE_ELEMENTARY_X
    struct
@@ -244,7 +241,7 @@ struct _Efl_Ui_Win_Data
    } event_forward;
 
    struct {
-      /* frame_obj is always used except for FAKE, SOCKET and INLINE */
+      /* frame_obj is always used except for FAKE */
       Eina_Bool need : 1; /**< if true, application draws its own csd */
       Eina_Bool need_shadow : 1; /**< if true, application draws its csd and 
shadow */
       Eina_Bool need_borderless : 1;
@@ -258,6 +255,11 @@ struct _Efl_Ui_Win_Data
       Eina_Bool cur_menu : 1;
    } csd;
 
+   struct {
+      Evas_Object *box, *edje;
+      Eina_Bool    forbidden : 1; /**< Marks some legacy APIs as not allowed. 
*/
+   } legacy;
+
    Eina_Bool    urgent : 1;
    Eina_Bool    modal : 1;
    Eina_Bool    demand_attention : 1;
@@ -277,14 +279,6 @@ struct _Efl_Ui_Win_Data
    Eina_Bool    application_alpha : 1; /**< alpha value set by an 
elm_win_alpha_set() api. this has lower priority than theme_alpha */
 };
 
-struct _Box_Item_Iterator
-{
-   Eina_Iterator  iterator;
-   Eina_List     *list;
-   Eina_Iterator *real_iterator;
-   Eo            *object;
-};
-
 struct _Input_Pointer_Iterator
 {
    Eina_Iterator  iterator;
@@ -355,6 +349,7 @@ static Eina_Bool _elm_win_auto_throttled = EINA_FALSE;
 
 static Ecore_Timer *_elm_win_state_eval_timer = NULL;
 
+static void _elm_win_legacy_init(Efl_Ui_Win_Data *sd);
 static void
 _elm_win_on_resize_obj_changed_size_hints(void *data,
                                           Evas *e,
@@ -910,7 +905,7 @@ _elm_win_resize_job(void *data)
      }
    sd->response++;
    evas_object_resize(sd->obj, w, h);
-   evas_object_resize(sd->edje, w, h);
+   evas_object_resize(sd->legacy.edje, w, h);
    sd->response--;
 }
 
@@ -2666,7 +2661,7 @@ _efl_ui_win_efl_canvas_group_group_del(Eo *obj, 
Efl_Ui_Win_Data *sd)
    if ((sd->modal) && (sd->modal_count > 0)) 
      ERR("Deleted modal win was blocked by another modal win which was created 
after creation of that win.");
 
-   evas_object_event_callback_del_full(sd->edje,
+   evas_object_event_callback_del_full(sd->legacy.edje,
                                        EVAS_CALLBACK_CHANGED_SIZE_HINTS,
                                        
_elm_win_on_resize_obj_changed_size_hints,
                                        obj);
@@ -2676,9 +2671,8 @@ _efl_ui_win_efl_canvas_group_group_del(Eo *obj, 
Efl_Ui_Win_Data *sd)
    efl_event_callback_array_del(obj, _elm_win_evas_feed_fake_callbacks(), 
sd->evas);
 
    efl_event_callback_del(sd->evas, EFL_EVENT_POINTER_UP, 
_elm_win_cb_mouse_up, sd);
-
-   evas_object_del(sd->box);
-   evas_object_del(sd->edje);
+   evas_object_del(sd->legacy.box);
+   evas_object_del(sd->legacy.edje);
 
    /* NB: child deletion handled by parent's smart del */
 
@@ -3262,11 +3256,11 @@ _elm_win_resize_objects_eval(Evas_Object *obj)
    Evas_Coord w, h, minw, minh, maxw, maxh;
    double wx, wy;
 
-   efl_gfx_size_hint_combined_min_get(sd->edje, &minw, &minh);
+   efl_gfx_size_hint_combined_min_get(sd->legacy.edje, &minw, &minh);
    if (minw < 1) minw = 1;
    if (minh < 1) minh = 1;
 
-   evas_object_size_hint_weight_get(sd->edje, &wx, &wy);
+   evas_object_size_hint_weight_get(sd->legacy.edje, &wx, &wy);
    if (!wx) maxw = minw;
    else maxw = 32767;
    if (!wy) maxh = minh;
@@ -3676,7 +3670,7 @@ _elm_win_frame_obj_move(void *data,
    Efl_Ui_Win_Data *sd;
 
    if (!(sd = data)) return;
-   if (!sd->edje) return;
+   if (!sd->legacy.edje) return;
 
    _elm_win_frame_obj_update(sd);
 }
@@ -3690,7 +3684,7 @@ _elm_win_frame_obj_resize(void *data,
    Efl_Ui_Win_Data *sd;
 
    if (!(sd = data)) return;
-   if (!sd->edje) return;
+   if (!sd->legacy.edje) return;
 
    _elm_win_frame_obj_update(sd);
 }
@@ -3995,7 +3989,7 @@ _elm_win_frame_add(Efl_Ui_Win_Data *sd, const char *style)
     * the fly. */
    efl_canvas_object_is_frame_object_set(sd->frame_obj, 2);
 
-   edje_object_part_swallow(sd->frame_obj, "elm.swallow.client", sd->edje);
+   edje_object_part_swallow(sd->frame_obj, "elm.swallow.client", 
sd->legacy.edje);
 
    if (sd->icon)
      evas_object_show(sd->icon);
@@ -4260,59 +4254,6 @@ _elm_win_cb_show(void *data EINA_UNUSED,
    _elm_win_state_eval_queue();
 }
 
-/**
-  * @internal
-  *
-  * Recalculate the size of window considering its resize objects' weight and
-  * min size. If any of its resize objects' weight equals to 0.0, window
-  * layout's weight will be set to 0.0.
-  *
-  * @param o box object
-  * @param p box's private data
-  * @param data window object
-  */
-static void
-_window_layout_stack(Evas_Object *o, Evas_Object_Box_Data *p, void *data)
-{
-   const Eina_List *l;
-   Evas_Object *child;
-   Evas_Object_Box_Option *opt;
-   Evas_Coord x, y, w, h;
-   double wx, wy;
-   Evas_Coord minw = -1, minh = -1;
-   double weight_x = EVAS_HINT_EXPAND;
-   double weight_y = EVAS_HINT_EXPAND;
-
-   EINA_LIST_FOREACH(p->children, l, opt)
-     {
-        child = opt->obj;
-        evas_object_size_hint_weight_get(child, &wx, &wy);
-        if (wx == 0.0) weight_x = 0;
-        if (wy == 0.0) weight_y = 0;
-
-        efl_gfx_size_hint_combined_min_get(child, &w, &h);
-        if (w > minw) minw = w;
-        if (h > minh) minh = h;
-     }
-
-   evas_object_size_hint_min_set(o, minw, minh);
-   evas_object_geometry_get(o, &x, &y, &w, &h);
-   if (w < minw) w = minw;
-   if (h < minh) h = minh;
-   evas_object_resize(o, w, h);
-
-   EINA_LIST_FOREACH(p->children, l, opt)
-     {
-        child = opt->obj;
-        evas_object_move(child, x, y);
-        evas_object_resize(child, w, h);
-     }
-
-   ELM_WIN_DATA_GET(data, sd);
-   evas_object_size_hint_weight_set(sd->edje, weight_x, weight_y);
-   evas_object_smart_changed(sd->edje);
-}
-
 static Eina_Bool
 _accel_is_gl(const char *accel)
 {
@@ -4948,21 +4889,7 @@ _elm_win_finalize_internal(Eo *obj, Efl_Ui_Win_Data *sd, 
const char *name, Elm_W
           }
      }
 
-   sd->edje = edje_object_add(sd->evas);
-   _elm_win_theme_internal(obj, sd);
-
-   sd->box = evas_object_box_add(sd->evas);
-   evas_object_box_layout_set(sd->box, _window_layout_stack, obj, NULL);
-   edje_object_part_swallow(sd->edje, "elm.swallow.contents", sd->box);
-   evas_object_move(sd->edje, 0, 0);
-   evas_object_resize(sd->edje, 1, 1);
-   if (type != ELM_WIN_FAKE)
-     {
-        edje_object_update_hints_set(sd->edje, EINA_TRUE);
-        evas_object_event_callback_add(sd->edje, 
EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                       
_elm_win_on_resize_obj_changed_size_hints, obj);
-     }
-
+   _elm_win_legacy_init(sd);
    _elm_win_need_frame_adjust(sd, engine);
    _elm_win_apply_alpha(obj, sd);
 
@@ -5040,8 +4967,7 @@ _elm_win_finalize_internal(Eo *obj, Efl_Ui_Win_Data *sd, 
const char *name, Elm_W
    efl_event_callback_add(obj, EFL_EVENT_CALLBACK_DEL, _win_event_del_cb, sd);
 
    efl_event_callback_add(sd->evas, EFL_EVENT_POINTER_UP, 
_elm_win_cb_mouse_up, sd);
-
-   evas_object_show(sd->edje);
+   evas_object_show(sd->legacy.edje);
 
    if (type == ELM_WIN_FAKE)
      {
@@ -5187,102 +5113,6 @@ elm_win_util_dialog_add(Evas_Object *parent, const char 
*name, const char *title
    return win;
 }
 
-EOLIAN static Eina_Bool
-_efl_ui_win_efl_pack_pack(Eo *obj, Efl_Ui_Win_Data *sd, Efl_Gfx *subobj)
-{
-   Eina_Bool ret;
-
-   ret  = elm_widget_sub_object_add(obj, subobj);
-   ret &= (evas_object_box_append(sd->box, subobj) != NULL);
-
-   if (!ret)
-     ERR("could not add sub object %p to window %p", subobj, obj);
-
-   return ret;
-}
-
-EOLIAN static Eina_Bool
-_efl_ui_win_efl_pack_unpack(Eo *obj, Efl_Ui_Win_Data *sd, Efl_Gfx *subobj)
-{
-   Eina_Bool ret;
-
-   ret  = elm_widget_sub_object_del(obj, subobj);
-   ret &= evas_object_box_remove(sd->box, subobj);
-
-   if (!ret)
-     ERR("could not remove sub object %p from window %p", subobj, obj);
-
-   return ret;
-}
-
-EOLIAN static Eina_Bool
-_efl_ui_win_efl_container_content_remove(Eo *obj, Efl_Ui_Win_Data *sd 
EINA_UNUSED,
-                                      Efl_Gfx *subobj)
-{
-   return efl_pack_unpack(obj, subobj);
-}
-
-EOLIAN static int
-_efl_ui_win_efl_container_content_count(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data 
*sd)
-{
-   Evas_Object_Box_Data *bd;
-
-   bd = efl_data_scope_get(sd->box, EVAS_BOX_CLASS);
-   if (!bd) return 0;
-
-   return eina_list_count(bd->children);
-}
-
-/* same as efl.ui.box but container is an elm win */
-static Eina_Bool
-_box_item_iterator_next(Box_Item_Iterator *it, void **data)
-{
-   Efl_Gfx *sub;
-
-   if (!eina_iterator_next(it->real_iterator, (void **) &sub))
-     return EINA_FALSE;
-
-   if (data) *data = sub;
-   return EINA_TRUE;
-}
-
-static Elm_Layout *
-_box_item_iterator_get_container(Box_Item_Iterator *it)
-{
-   return it->object;
-}
-
-static void
-_box_item_iterator_free(Box_Item_Iterator *it)
-{
-   eina_iterator_free(it->real_iterator);
-   eina_list_free(it->list);
-   free(it);
-}
-
-EOLIAN static Eina_Iterator *
-_efl_ui_win_efl_container_content_iterate(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data 
*sd)
-{
-   Box_Item_Iterator *it;
-
-   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
-
-   it = calloc(1, sizeof(*it));
-   if (!it) return NULL;
-
-   EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
-
-   it->list = evas_object_box_children_get(sd->box);
-   it->real_iterator = eina_list_iterator_new(it->list);
-   it->iterator.version = EINA_ITERATOR_VERSION;
-   it->iterator.next = FUNC_ITERATOR_NEXT(_box_item_iterator_next);
-   it->iterator.get_container = 
FUNC_ITERATOR_GET_CONTAINER(_box_item_iterator_get_container);
-   it->iterator.free = FUNC_ITERATOR_FREE(_box_item_iterator_free);
-   it->object = obj;
-
-   return &it->iterator;
-}
-
 EOLIAN static void
 _efl_ui_win_role_set(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *sd, const char 
*role)
 {
@@ -5478,7 +5308,7 @@ _main_menu_swallow_get(Efl_Ui_Win_Data *sd)
         if (edje_object_part_exists(sd->frame_obj, "elm.swallow.menu"))
           return sd->frame_obj;
      }
-   return sd->edje;
+   return sd->legacy.edje;
 }
 
 static void
@@ -6047,12 +5877,12 @@ _elm_win_theme_internal(Eo *obj, Efl_Ui_Win_Data *sd)
    Eina_Bool ret = EINA_FALSE;
    const char *s;
 
-   int_ret = _elm_theme_object_set(obj, sd->edje, "win", "base",
+   int_ret = _elm_theme_object_set(obj, sd->legacy.edje, "win", "base",
                                    elm_widget_style_get(obj));
    if (!int_ret) return ELM_THEME_APPLY_FAILED;
 
-   edje_object_mirrored_set(sd->edje, elm_widget_mirrored_get(obj));
-   edje_object_scale_set(sd->edje,
+   edje_object_mirrored_set(sd->legacy.edje, elm_widget_mirrored_get(obj));
+   edje_object_scale_set(sd->legacy.edje,
                          elm_widget_scale_get(obj) * elm_config_scale_get());
 
    efl_event_callback_legacy_call(obj, EFL_UI_WIN_EVENT_THEME_CHANGED, NULL);
@@ -6060,7 +5890,7 @@ _elm_win_theme_internal(Eo *obj, Efl_Ui_Win_Data *sd)
 
    if (!ret) int_ret = ELM_THEME_APPLY_FAILED;
 
-   s = edje_object_data_get(sd->edje, "alpha");
+   s = edje_object_data_get(sd->legacy.edje, "alpha");
    if (!sd->theme_alpha)
      {
         if (s)
@@ -6359,17 +6189,21 @@ if (x < 0) { x = 0; bad = 1; } } while (0)
 
 #define WIN_PART_ERR(part) ERR("No such part in window: '%s'. Supported parts 
are: 'background'.", part);
 
-static void
+static Eina_Bool
 _elm_win_bg_set(Efl_Ui_Win_Data *sd, Eo *bg)
 {
    ELM_SAFE_DEL(sd->bg);
-   if (!bg) return;
+   if (!bg) return EINA_TRUE;
 
-   edje_object_part_swallow(sd->frame_obj, "elm.swallow.background", bg);
+   if (!elm_widget_sub_object_add(sd->obj, bg))
+     return EINA_FALSE;
+   if (!edje_object_part_swallow(sd->frame_obj, "elm.swallow.background", bg))
+     return EINA_FALSE;
    efl_gfx_visible_set(bg, 1);
    efl_gfx_size_hint_align_set(bg, -1, -1);
    efl_gfx_size_hint_weight_set(bg, 1, 1);
    efl_wref_add(bg, &sd->bg);
+   return EINA_TRUE;
 }
 
 void
@@ -6386,34 +6220,47 @@ _elm_win_standard_init(Eo *obj)
 }
 
 static Eina_Bool
-_efl_ui_win_content_set(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *sd, const char 
*part, Eo *content)
+_efl_ui_win_content_set(Eo *obj, Efl_Ui_Win_Data *sd, const char *part, Eo 
*content)
 {
+   sd->legacy.forbidden = EINA_TRUE;
    if (!part) part = "content";
    if (eina_streq(part, "content"))
      {
-        // FIXME / TODO
+        if (sd->content == content) return EINA_TRUE;
+        if (!elm_widget_sub_object_add(obj, content))
+          goto err;
+        /* FIXME: Switch to swallow inside the frame
+        if (!edje_object_part_swallow(sd->frame_obj, "elm.swallow.client", 
content))
+          goto err;
+        */
+        evas_object_box_append(sd->legacy.box, content);
+        evas_object_show(content);
+        efl_wref_add(content, &sd->content);
         return EINA_TRUE;
      }
    else if (eina_streq(part, "background"))
      {
         if (sd->bg == content) return EINA_TRUE;
-        _elm_win_bg_set(sd, content);
+        if (!_elm_win_bg_set(sd, content))
+          goto err;
         return EINA_TRUE;
      }
 
    WIN_PART_ERR(part);
    return EINA_FALSE;
+
+err:
+   ERR("Failed to set object %p as %s for window %p", content, part, obj);
+   return EINA_FALSE;
 }
 
 static Efl_Canvas_Object *
 _efl_ui_win_content_get(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *sd, const char 
*part)
 {
+   sd->legacy.forbidden = EINA_TRUE;
    if (!part) part = "content";
    if (eina_streq(part, "content"))
-     {
-        // FIXME / TODO
-        return NULL;
-     }
+     return sd->content;
    else if (eina_streq(part, "background"))
      return sd->bg;
 
@@ -6424,7 +6271,10 @@ _efl_ui_win_content_get(Eo *obj EINA_UNUSED, 
Efl_Ui_Win_Data *sd, const char *pa
 static Efl_Canvas_Object *
 _efl_ui_win_content_unset(Eo *obj, Efl_Ui_Win_Data *sd, const char *part)
 {
-   Eo *content = _efl_ui_win_content_get(obj, sd, part);
+   Eo *content;
+
+   sd->legacy.forbidden = EINA_TRUE;
+   content = _efl_ui_win_content_get(obj, sd, part);
    if (!content) return NULL;
 
    efl_ref(content);
@@ -6435,6 +6285,7 @@ _efl_ui_win_content_unset(Eo *obj, Efl_Ui_Win_Data *sd, 
const char *part)
 static Eina_Bool
 _efl_ui_win_part_color_set(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *sd, const 
char *part, int r, int g, int b, int a)
 {
+   sd->legacy.forbidden = EINA_TRUE;
    if (eina_streq(part, "background"))
      {
         sd->csd.need_bg_solid = EINA_TRUE;
@@ -6450,6 +6301,7 @@ _efl_ui_win_part_color_set(Eo *obj EINA_UNUSED, 
Efl_Ui_Win_Data *sd, const char
 static Eina_Bool
 _efl_ui_win_part_color_get(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *sd, const 
char *part, int *r, int *g, int *b, int *a)
 {
+   sd->legacy.forbidden = EINA_TRUE;
    if (eina_streq(part, "background"))
      {
         edje_object_color_class_get(sd->frame_obj, "elm/win/background", r, g, 
b, a, 0, 0, 0, 0, 0, 0, 0, 0);
@@ -6463,6 +6315,7 @@ _efl_ui_win_part_color_get(Eo *obj EINA_UNUSED, 
Efl_Ui_Win_Data *sd, const char
 static Eina_Bool
 _efl_ui_win_part_file_set(Eo *obj, Efl_Ui_Win_Data *sd, const char *part, 
const char *file, const char *key)
 {
+   sd->legacy.forbidden = EINA_TRUE;
    if (eina_streq(part, "background"))
      {
         Eina_Bool ok = EINA_TRUE;
@@ -6491,6 +6344,7 @@ _efl_ui_win_part_file_set(Eo *obj, Efl_Ui_Win_Data *sd, 
const char *part, const
 static Eina_Bool
 _efl_ui_win_part_file_get(Eo *obj, Efl_Ui_Win_Data *sd, const char *part, 
const char **file, const char **key)
 {
+   sd->legacy.forbidden = EINA_TRUE;
    if (file) *file = NULL;
    if (key) *key = NULL;
 
@@ -6537,6 +6391,24 @@ _efl_ui_win_internal_part_efl_file_file_get(Eo *obj, 
Elm_Part_Data *pd, const ch
    ELM_PART_RETURN_VOID;
 }
 
+EOLIAN static Eina_Bool
+_efl_ui_win_efl_container_content_set(Eo *obj, Efl_Ui_Win_Data *sd, 
Evas_Object *content)
+{
+   return _efl_ui_win_content_set(obj, sd, NULL, content);
+}
+
+EOLIAN static Evas_Object*
+_efl_ui_win_efl_container_content_get(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *sd)
+{
+   return _efl_ui_win_content_get(obj, sd, NULL);
+}
+
+EOLIAN static Evas_Object*
+_efl_ui_win_efl_container_content_unset(Eo *obj, Efl_Ui_Win_Data *sd)
+{
+   return _efl_ui_win_content_unset(obj, sd, NULL);
+}
+
 ELM_PART_IMPLEMENT(efl_ui_win, EFL_UI_WIN, Efl_Ui_Win_Data, Elm_Part_Data)
 ELM_PART_IMPLEMENT_CONTENT_SET(efl_ui_win, EFL_UI_WIN, Efl_Ui_Win_Data, 
Elm_Part_Data)
 ELM_PART_IMPLEMENT_CONTENT_GET(efl_ui_win, EFL_UI_WIN, Efl_Ui_Win_Data, 
Elm_Part_Data)
@@ -6707,20 +6579,6 @@ _efl_ui_win_move_resize_start(Eo *obj EINA_UNUSED, 
Efl_Ui_Win_Data *sd, Efl_Ui_W
    return res;
 }
 
-/* legacy APIs */
-
-EAPI void
-elm_win_resize_object_add(Eo *obj, Evas_Object *subobj)
-{
-   efl_pack(obj, subobj);
-}
-
-EAPI void
-elm_win_resize_object_del(Eo *obj, Evas_Object *subobj)
-{
-   efl_pack_unpack(obj, subobj);
-}
-
 /* windowing specific calls - shall we do this differently? */
 
 EAPI Ecore_X_Window
@@ -7693,6 +7551,124 @@ elm_win_aspect_get(const Eo *obj)
    return _win_aspect_get(sd);
 }
 
+/* legacy APIs */
+
+/**
+  * @internal
+  *
+  * Recalculate the size of window considering its resize objects' weight and
+  * min size. If any of its resize objects' weight equals to 0.0, window
+  * layout's weight will be set to 0.0.
+  *
+  * @param o box object
+  * @param p box's private data
+  * @param data window object
+  */
+static void
+_window_layout_stack(Evas_Object *o, Evas_Object_Box_Data *p, void *data)
+{
+   const Eina_List *l;
+   Evas_Object *child;
+   Evas_Object_Box_Option *opt;
+   Evas_Coord x, y, w, h;
+   double wx, wy;
+   Evas_Coord minw = -1, minh = -1;
+   double weight_x = EVAS_HINT_EXPAND;
+   double weight_y = EVAS_HINT_EXPAND;
+
+   EINA_LIST_FOREACH(p->children, l, opt)
+     {
+        child = opt->obj;
+        evas_object_size_hint_weight_get(child, &wx, &wy);
+        if (wx == 0.0) weight_x = 0;
+        if (wy == 0.0) weight_y = 0;
+
+        efl_gfx_size_hint_combined_min_get(child, &w, &h);
+        if (w > minw) minw = w;
+        if (h > minh) minh = h;
+     }
+
+   evas_object_size_hint_min_set(o, minw, minh);
+   evas_object_geometry_get(o, &x, &y, &w, &h);
+   if (w < minw) w = minw;
+   if (h < minh) h = minh;
+   evas_object_resize(o, w, h);
+
+   EINA_LIST_FOREACH(p->children, l, opt)
+     {
+        child = opt->obj;
+        evas_object_move(child, x, y);
+        evas_object_resize(child, w, h);
+     }
+
+   ELM_WIN_DATA_GET(data, sd);
+   evas_object_size_hint_weight_set(sd->legacy.edje, weight_x, weight_y);
+   evas_object_smart_changed(sd->legacy.edje);
+}
+
+static void
+_elm_win_legacy_init(Efl_Ui_Win_Data *sd)
+{
+   sd->legacy.edje = edje_object_add(sd->evas);
+   _elm_win_theme_internal(sd->obj, sd);
+
+   sd->legacy.box = evas_object_box_add(sd->evas);
+   evas_object_box_layout_set(sd->legacy.box, _window_layout_stack, sd->obj, 
NULL);
+   edje_object_part_swallow(sd->legacy.edje, "elm.swallow.contents", 
sd->legacy.box);
+   evas_object_move(sd->legacy.edje, 0, 0);
+   evas_object_resize(sd->legacy.edje, 1, 1);
+   if (sd->type != ELM_WIN_FAKE)
+     {
+        edje_object_update_hints_set(sd->legacy.edje, EINA_TRUE);
+        evas_object_event_callback_add(sd->legacy.edje, 
EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+                                       
_elm_win_on_resize_obj_changed_size_hints, sd->obj);
+     }
+}
+
+EAPI void
+elm_win_resize_object_add(Eo *obj, Evas_Object *subobj)
+{
+   Eina_Bool ret;
+
+   ELM_WIN_CHECK(obj);
+   ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
+
+   if (sd->legacy.forbidden)
+     {
+        CRI("Use of this API is forbidden after calling an EO API on this "
+            "window. Fix your code!");
+        return;
+     }
+
+   ret  = elm_widget_sub_object_add(obj, subobj);
+   ret &= (evas_object_box_append(sd->legacy.box, subobj) != NULL);
+
+   if (!ret)
+     ERR("could not add sub object %p to window %p", subobj, obj);
+}
+
+EAPI void
+elm_win_resize_object_del(Eo *obj, Evas_Object *subobj)
+{
+   Eina_Bool ret;
+
+   ELM_WIN_CHECK(obj);
+   ELM_WIN_DATA_GET_OR_RETURN(obj, sd);
+
+   if (sd->legacy.forbidden)
+     {
+        CRI("Use of this API is forbidden after calling an EO API on this "
+            "window. Fix your code!");
+        return;
+     }
+
+   ret  = elm_widget_sub_object_del(obj, subobj);
+   ret &= evas_object_box_remove(sd->legacy.box, subobj);
+
+   if (!ret)
+     ERR("could not remove sub object %p from window %p", subobj, obj);
+}
+
 // deprecated
 EAPI void
 elm_win_name_set(Evas_Object *obj, const char *name)
diff --git a/src/lib/elementary/efl_ui_win.eo b/src/lib/elementary/efl_ui_win.eo
index e4d39b0..7af31b9 100644
--- a/src/lib/elementary/efl_ui_win.eo
+++ b/src/lib/elementary/efl_ui_win.eo
@@ -172,7 +172,7 @@ enum Efl.Ui.Win.Move_Resize_Mode
 }
 
 class Efl.Ui.Win (Elm.Widget, Efl.Canvas, Elm.Interface.Atspi.Window,
-               Elm.Interface.Atspi_Widget_Action, Efl.Pack,
+               Elm.Interface.Atspi_Widget_Action, Efl.Container,
                Efl.Input.State, Efl.Input.Interface, Efl.Screen,
                Efl.Gfx.Size.Hint, Efl.Text, Efl.Config.Global,
                Efl.Part)
@@ -909,11 +909,6 @@ class Efl.Ui.Win (Elm.Widget, Efl.Canvas, 
Elm.Interface.Atspi.Window,
       Elm.Interface.Atspi_Accessible.state_set.get;
       Elm.Interface.Atspi_Accessible.name.get;
       Elm.Interface.Atspi_Widget_Action.elm_actions.get;
-      Efl.Container.content_remove;
-      Efl.Container.content_iterate;
-      Efl.Container.content_count;
-      Efl.Pack.unpack;
-      Efl.Pack.pack;
       Efl.Input.State.modifier_enabled.get;
       Efl.Input.State.lock_enabled.get;
       Efl.Screen.screen_dpi.get;
@@ -936,6 +931,9 @@ class Efl.Ui.Win (Elm.Widget, Efl.Canvas, 
Elm.Interface.Atspi.Window,
       Efl.Canvas.object_top_at_xy_get;
       Efl.Canvas.objects_in_rectangle_get;
       Efl.Canvas.object_top_in_rectangle_get;
+      Efl.Container.content.set;
+      Efl.Container.content.get;
+      Efl.Container.content_unset;
       Efl.Part.part;
    }
    constructors {

-- 


Reply via email to