--- /dev/null
+#include "e_view_layout_intern.h"
+#include "e_layout_intern.h"
+#include "e_view_intern.h"
+
+struct _E_View_Layout
+{
+ E_View view;
+
+ Eina_List *children;
+};
+
+static void _view_layout_handle_destroy(E_View *view);
+
+const static E_View_Impl view_layout_impl = {
+ .destroy = _view_layout_handle_destroy,
+};
+
+static E_View_Layout *
+_view_layout_from_view(E_View *view)
+{
+ E_View_Layout *layout;
+ assert(view->impl == &view_layout_impl);
+ return wl_container_of(view, layout, view);
+}
+
+static void
+_view_layout_handle_destroy(E_View *view)
+{
+ E_View_Layout *layout = _view_layout_from_view(view);
+
+ evas_object_del(view->eo);
+ free(layout);
+}
+
+EINTERN int
+e_view_layout_freeze(E_View *view)
+{
+ return e_layout_freeze(view->eo);
+}
+
+EINTERN int
+e_view_layout_thaw(E_View *view)
+{
+ return e_layout_thaw(view->eo);
+}
+
+EINTERN void
+e_view_layout_virtual_size_get(E_View *view, int *w, int *h)
+{
+ e_layout_virtual_size_get(view->eo, w, h);
+}
+
+EINTERN void
+e_view_layout_child_lower(E_View *view)
+{
+ e_layout_child_lower(view->eo);
+}
+
+EINTERN void
+e_view_layout_child_raise_above(E_View *view, E_View *above)
+{
+ e_layout_child_raise_above(view->eo, above->eo);
+}
+
+EINTERN void
+e_view_layout_child_lower_below (E_View *view, E_View *below)
+{
+ e_layout_child_lower_below(view->eo, below->eo);
+}
+
+EINTERN void
+e_view_layout_child_geometry_get(E_View *view, int *x, int *y, int *w, int *h)
+{
+ e_layout_child_geometry_get(view->eo, x, y, w, h);
+}
+
+EINTERN E_View *
+e_view_layout_top_child_at_xy_get(E_View *view, int x, int y, Eina_Bool vis, const Eina_List *ignore)
+{
+ Evas_Object* obj;
+ E_View *ignore_view;
+ Eina_List *l, *evas_list = NULL;
+ EINA_LIST_FOREACH((Eina_List *)ignore, l, ignore_view)
+ {
+ evas_list = eina_list_append(evas_list, ignore_view->eo);
+ }
+
+ obj = e_layout_top_child_at_xy_get(view->eo, x, y, vis, evas_list);
+ eina_list_free(evas_list);
+
+ if (obj)
+ return evas_object_data_get(obj, "e_view");
+
+ return NULL;
+}
+
+EINTERN E_View *
+e_view_layout_child_below_get(E_View *view)
+{
+ Evas_Object* obj;
+
+ obj = e_layout_child_below_get(view->eo);
+
+ if (obj)
+ return evas_object_data_get(obj, "e_view");
+
+ return NULL;
+}
+
+EINTERN E_View *
+e_view_layout_child_above_get(E_View *view)
+{
+ Evas_Object* obj;
+
+ obj = e_layout_child_above_get(view->eo);
+
+ if (obj)
+ return evas_object_data_get(obj, "e_view");
+
+ return NULL;
+}
+
+EINTERN E_View *
+e_view_layout_top_child_get(E_View *view)
+{
+ Evas_Object* obj;
+
+ obj = e_layout_top_child_get(view->eo);
+
+ if (obj)
+ return evas_object_data_get(obj, "e_view");
+
+ return NULL;
+}
+
+EINTERN void
+e_view_layout_coord_canvas_to_virtual(E_View *view, int cx, int cy, int *vx, int *vy)
+{
+ e_layout_coord_canvas_to_virtual(view->eo, cx, cy, vx, vy);
+}
+
+EINTERN void
+e_view_layout_coord_virtual_to_canvas(E_View *view, int vx, int vy, int *cx, int *cy)
+{
+ e_layout_coord_virtual_to_canvas(view->eo, vx, vy, cx, cy);
+}
+
+E_API E_View_Layout *
+e_view_layout_try_from_view(E_View *view)
+{
+ if (view->impl != &view_layout_impl)
+ return NULL;
+
+ return _view_layout_from_view(view);
+}
+
+
+E_API E_View *
+e_view_layout_view_get(E_View_Layout *layout)
+{
+ return &layout->view;
+}
+
+E_API E_View_Layout *
+e_view_layout_create(E_View_Tree *parent)
+{
+ E_Canvas *canvas;
+ E_View_Layout *layout;
+ Evas_Object *eo;
+
+ assert(parent != NULL);
+
+ layout = malloc(sizeof(*layout));
+ if (!layout) return NULL;
+
+ layout->children = NULL;
+
+ canvas = e_view_root_get(&parent->view);
+ eo = e_layout_add(canvas->evas);
+ if (!eo)
+ {
+ free(layout);
+ return NULL;
+ }
+
+ e_view_init(&layout->view, E_VIEW_TYPE_LAYOUT, (E_View_Impl*)&view_layout_impl, eo, parent);
+
+ return layout;
+}
+
+E_API void
+e_view_layout_virtual_size_set(E_View_Layout *layout, int w, int h)
+{
+ E_View *view;
+
+ if (!layout) return;
+
+ view = e_view_layout_view_get(layout);
+ e_layout_virtual_size_set(view->eo, w, h);
+}
+
+E_API void
+e_view_layout_pack(E_View_Layout *layout, E_View *child)
+{
+ E_View *view;
+
+ if (!layout || !child) return;
+
+ view = e_view_layout_view_get(layout);
+ e_layout_pack(view->eo, child->eo);
+
+ layout->children = eina_list_append(layout->children, child);
+ e_view_data_set(child, "e_view_layout", layout);
+}
+
+E_API void
+e_view_layout_unpack(E_View *child)
+{
+ if (!child) return;
+
+ E_View_Layout *layout = e_view_data_get(child, "e_view_layout");
+ if (!layout) return;
+
+ layout->children = eina_list_remove(layout->children, child);
+ e_layout_unpack(child->eo);
+}
+
+E_API Eina_List *
+e_view_layout_children_get(E_View_Layout *layout)
+{
+ if (!layout) return NULL;
+
+ return layout->children;
+}
+
+E_API void
+e_view_layout_child_move(E_View *child, int x, int y)
+{
+ e_layout_child_move(child->eo, x, y);
+}
+
+E_API void
+e_view_layout_child_resize(E_View *child, int w, int h)
+{
+ e_layout_child_resize(child->eo, w, h);
+}
+
+E_API void
+e_view_layout_child_raise (E_View *child)
+{
+ e_layout_child_raise(child->eo);
+}
--- /dev/null
+#ifndef E_VIEW_LAYOUT_INTERN_H
+#define E_VIEW_LAYOUT_INTERN_H
+
+#include "e_intern.h"
+#include "e_view_layout.h"
+
+EINTERN int e_view_layout_freeze (E_View *view);
+EINTERN int e_view_layout_thaw (E_View *view);
+EINTERN void e_view_layout_virtual_size_get (E_View *view, int *w, int *h);
+EINTERN void e_view_layout_child_lower (E_View *view);
+EINTERN void e_view_layout_child_raise_above (E_View *view, E_View *above);
+EINTERN void e_view_layout_child_lower_below (E_View *view, E_View *below);
+EINTERN void e_view_layout_child_geometry_get(E_View *view, int *x, int *y, int *w, int *h);
+EINTERN E_View *e_view_layout_top_child_at_xy_get(E_View *view, int x, int y, Eina_Bool vis, const Eina_List *ignore);
+EINTERN E_View *e_view_layout_child_below_get(E_View *view);
+EINTERN E_View *e_view_layout_child_above_get(E_View *view);
+EINTERN E_View *e_view_layout_top_child_get(E_View *view);
+
+EINTERN void e_view_layout_coord_canvas_to_virtual (E_View *view, int cx, int cy, int *vx, int *vy);
+EINTERN void e_view_layout_coord_virtual_to_canvas (E_View *view, int vx, int vy, int *cx, int *cy);
+
+#endif