+static void
+_elm_win_frame_add(Elm_Win *win, const char *style)
+{
+ evas_output_framespace_set(win->evas, 0, 22, 0, 26);
+
+ win->frame_obj = edje_object_add(win->evas);
+ _elm_theme_set(NULL, win->frame_obj, "border", "base", style);
+ evas_object_is_frame_object_set(win->frame_obj, EINA_TRUE);
+ evas_object_move(win->frame_obj, 0, 0);
+ evas_object_resize(win->frame_obj, 1, 1);
+
+ edje_object_signal_callback_add(win->frame_obj, "elm,action,move,start",
+ "elm", _elm_win_frame_cb_move_start, win);
+ edje_object_signal_callback_add(win->frame_obj, "elm,action,resize,start",
+ "*", _elm_win_frame_cb_resize_start, win);
+ edje_object_signal_callback_add(win->frame_obj, "elm,action,minimize",
+ "elm", _elm_win_frame_cb_minimize, win);
+ edje_object_signal_callback_add(win->frame_obj, "elm,action,maximize",
+ "elm", _elm_win_frame_cb_maximize, win);
+ edje_object_signal_callback_add(win->frame_obj, "elm,action,close",
+ "elm", _elm_win_frame_cb_close, win);
+}
+
+static void
+_elm_win_frame_cb_move_start(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__)
+{
+ Elm_Win *win;
+
+ if (!(win = data)) return;
+ /* FIXME: Change mouse pointer */
+
+ /* NB: 0,0 are dummy values. Wayland handles the move by itself */
+ ecore_evas_move(win->ee, 0, 0);
+}
+
+static void
+_elm_win_frame_cb_resize_start(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source)
+{
+ Elm_Win *win;
+
+ if (!(win = data)) return;
+ if (win->resizing) return;
+ win->resizing = EINA_TRUE;
+
+ /* FIXME: Change mouse pointer */
+
+ if (!strcmp(source, "elm.event.resize.t"))
+ win->resize_location = 1;
+ else if (!strcmp(source, "elm.event.resize.b"))
+ win->resize_location = 2;
+ else if (!strcmp(source, "elm.event.resize.l"))
+ win->resize_location = 4;
+ else if (!strcmp(source, "elm.event.resize.r"))
+ win->resize_location = 8;
+ else if (!strcmp(source, "elm.event.resize.tl"))
+ win->resize_location = 5;
+ else if (!strcmp(source, "elm.event.resize.tr"))
+ win->resize_location = 9;
+ else if (!strcmp(source, "elm.event.resize.bl"))
+ win->resize_location = 6;
+ else if (!strcmp(source, "elm.event.resize.br"))
+ win->resize_location = 10;
+ else
+ win->resize_location = 0;
+
+ if (win->resize_location > 0)
+ ecore_evas_wayland_resize(win->ee, win->resize_location);
+}
+
+static void
+_elm_win_frame_cb_minimize(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__)
+{
+ Elm_Win *win;
+
+ if (!(win = data)) return;
+ ecore_evas_iconified_set(win->ee, EINA_TRUE);
+}
+
+static void
+_elm_win_frame_cb_maximize(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__)
+{
+ Elm_Win *win;
+
+ if (!(win = data)) return;
+ ecore_evas_maximized_set(win->ee, EINA_TRUE);
+}
+
+static void
+_elm_win_frame_cb_close(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__)
+{
+ Elm_Win *win;
+
+ if (!(win = data)) return;
+ evas_object_del(win->win_obj);
+}
+
+static void
+_elm_win_pointer_add(Elm_Win *win, const char *style)
+{
+ int mw, mh;
+
+ win->pointer.ee = ecore_evas_wayland_shm_new(NULL, 0, 0, 32, 32, 0);
+ ecore_evas_resize(win->pointer.ee, 32, 32);
+
+ win->pointer.evas = ecore_evas_get(win->ee);
+
+ win->pointer.obj = edje_object_add(win->pointer.evas);
+ _elm_theme_set(NULL, win->pointer.obj, "pointer", "base", style);
+ edje_object_size_min_calc(win->pointer.obj, &mw, &mh);
+ printf("ELM Win Pointer Size: %d %d\n", mw, mh);
+ evas_object_move(win->pointer.obj, 0, 0);
+ evas_object_resize(win->pointer.obj, 32, 32);
+ evas_object_show(win->pointer.obj);
+}
+