elementary/win - fixed invalid sd memory access when delete window inlined image
[framework/uifw/elementary.git] / src / lib / elm_win.c
index b4d1f88..5460b2d 100644 (file)
@@ -18,37 +18,74 @@ struct _Elm_Win
 
    Elm_Win_Type type;
    Elm_Win_Keyboard_Mode kbdmode;
-   struct {
-      const char *info;
+   Elm_Win_Indicator_Mode indmode;
+   Elm_Win_Indicator_Opacity_Mode ind_o_mode;
+   struct
+     {
+        const char *info;
+        Ecore_Timer *timer;
+        int repeat_count;
+        int shot_counter;
+     } shot;
+   int resize_location;
+   int *autodel_clear, rot;
+   int show_count;
+   struct
+     {
+        int x, y;
+     } screen;
+   struct
+     {
+        Ecore_Evas *ee;
+        Evas *evas;
+        Evas_Object *obj, *hot_obj;
+        int hot_x, hot_y;
+     } pointer;
+   struct
+     {
+        Evas_Object *top;
+
+        struct
+          {
+             Evas_Object *target;
+             Eina_Bool visible : 1;
+             Eina_Bool handled : 1;
+          } cur, prev;
+
+        const char *style;
+        Ecore_Job *reconf_job;
+
+        Eina_Bool enabled : 1;
+        Eina_Bool changed_theme : 1;
+        Eina_Bool top_animate : 1;
+        Eina_Bool geometry_changed : 1;
+     } focus_highlight;
+   struct
+   {
+      const char  *name;
       Ecore_Timer *timer;
-      int repeat_count;
-      int shot_counter;
-   } shot;
+      Eina_List   *names;
+   } profile;
+
+   Evas_Object *icon;
+   const char *title;
+   const char *icon_name;
+   const char *role;
+
+   double aspect;
+   Eina_Bool urgent : 1;
+   Eina_Bool modal : 1;
+   Eina_Bool demand_attention : 1;
    Eina_Bool autodel : 1;
    Eina_Bool constrain : 1;
-   int *autodel_clear, rot;
-   int show_count;
-   struct {
-      int x, y;
-   } screen;
-
-   struct {
-      Evas_Object *top;
-
-      struct {
-         Evas_Object *target;
-         Eina_Bool visible : 1;
-         Eina_Bool handled : 1;
-      } cur, prev;
-
-      const char *style;
-      Ecore_Job *reconf_job;
-
-      Eina_Bool enabled : 1;
-      Eina_Bool changed_theme : 1;
-      Eina_Bool top_animate : 1;
-      Eina_Bool geometry_changed : 1;
-   } focus_highlight;
+   Eina_Bool resizing : 1;
+   Eina_Bool iconified : 1;
+   Eina_Bool withdrawn : 1;
+   Eina_Bool sticky : 1;
+   Eina_Bool fullscreen : 1;
+   Eina_Bool maximized : 1;
+   Eina_Bool skip_focus : 1;
+   Eina_Bool floating : 1;
 };
 
 static const char *widtype = NULL;
@@ -75,17 +112,46 @@ static void _elm_win_focus_highlight_reconfigure_job_stop(Elm_Win *win);
 static void _elm_win_focus_highlight_anim_end(void *data, Evas_Object *obj, const char *emission, const char *source);
 static void _elm_win_focus_highlight_reconfigure(Elm_Win *win);
 
+static void _elm_win_frame_add(Elm_Win *win, const char *style);
+static void _elm_win_frame_cb_move_start(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__);
+static void _elm_win_frame_cb_resize_start(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source);
+static void _elm_win_frame_cb_minimize(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__);
+static void _elm_win_frame_cb_maximize(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__);
+static void _elm_win_frame_cb_close(void *data, Evas_Object *obj __UNUSED__, const char *sig __UNUSED__, const char *source __UNUSED__);
+
+//static void _elm_win_pointer_add(Elm_Win *win, const char *style);
+
 static const char SIG_DELETE_REQUEST[] = "delete,request";
 static const char SIG_FOCUS_OUT[] = "focus,out";
 static const char SIG_FOCUS_IN[] = "focus,in";
 static const char SIG_MOVED[] = "moved";
 static const char SIG_THEME_CHANGED[] = "theme,changed";
+static const char SIG_WITHDRAWN[] = "withdrawn";
+static const char SIG_ICONIFIED[] = "iconified";
+static const char SIG_NORMAL[] = "normal";
+static const char SIG_STICK[] = "stick";
+static const char SIG_UNSTICK[] = "unstick";
+static const char SIG_FULLSCREEN[] = "fullscreen";
+static const char SIG_UNFULLSCREEN[] = "unfullscreen";
+static const char SIG_MAXIMIZED[] = "maximized";
+static const char SIG_UNMAXIMIZED[] = "unmaximized";
+static const char SIG_PROFILE_CHANGED[] = "profile,changed";
 
 static const Evas_Smart_Cb_Description _signals[] = {
    {SIG_DELETE_REQUEST, ""},
    {SIG_FOCUS_OUT, ""},
    {SIG_FOCUS_IN, ""},
    {SIG_MOVED, ""},
+   {SIG_WITHDRAWN, ""},
+   {SIG_ICONIFIED, ""},
+   {SIG_NORMAL, ""},
+   {SIG_STICK, ""},
+   {SIG_UNSTICK, ""},
+   {SIG_FULLSCREEN, ""},
+   {SIG_UNFULLSCREEN, ""},
+   {SIG_MAXIMIZED, ""},
+   {SIG_UNMAXIMIZED, ""},
+   {SIG_PROFILE_CHANGED, ""},
    {NULL, NULL}
 };
 
@@ -115,7 +181,7 @@ _shot_delay_get(Elm_Win *win)
                   *pd = *p;
                }
              *pd = 0;
-             v = atof(d);
+             v = _elm_atof(d);
              free(d);
              return v;
           }
@@ -144,9 +210,10 @@ _shot_file_get(Elm_Win *win)
                   char *dotptr = strrchr(tmp, '.');
                   if (dotptr)
                     {
-                       repname = malloc(sizeof(char)*(strlen(tmp) + 16));
+                       size_t size = sizeof(char)*(strlen(tmp) + 16);
+                       repname = malloc(size);
                        strncpy(repname, tmp, dotptr - tmp);
-                       sprintf(repname + (dotptr - tmp), "%03i",
+                       snprintf(repname + (dotptr - tmp), size - (dotptr - tmp), "%03i",
                                win->shot.shot_counter + 1);
                        strcat(repname, dotptr);
                        free(tmp);
@@ -157,18 +224,15 @@ _shot_file_get(Elm_Win *win)
      }
    free(tmp);
    if (!win->shot.repeat_count) return strdup("out.png");
-   else
-     {
-        repname = malloc(sizeof(char) * 24);
-        sprintf(repname, "out%03i.png", win->shot.shot_counter + 1);
-        return repname;
-     }
+
+   repname = malloc(sizeof(char) * 24);
+   snprintf(repname, sizeof(char) * 24, "out%03i.png", win->shot.shot_counter + 1);
+   return repname;
 }
 
 static int
 _shot_repeat_count_get(Elm_Win *win)
 {
-
    char *p, *pd;
    char *d = strdup(win->shot.info);
 
@@ -302,6 +366,17 @@ _elm_win_resize(Ecore_Evas *ee)
 }
 
 static void
+_elm_win_mouse_in(Ecore_Evas *ee)
+{
+   Evas_Object *obj;
+   Elm_Win *win;
+
+   if (!(obj = ecore_evas_object_associate_get(ee))) return;
+   if (!(win = elm_widget_data_get(obj))) return;
+   if (win->resizing) win->resizing = EINA_FALSE;
+}
+
+static void
 _elm_win_focus_in(Ecore_Evas *ee)
 {
    Evas_Object *obj = ecore_evas_object_associate_get(ee);
@@ -311,9 +386,9 @@ _elm_win_focus_in(Ecore_Evas *ee)
    win = elm_widget_data_get(obj);
    if (!win) return;
    _elm_widget_top_win_focused_set(win->win_obj, EINA_TRUE);
-   if (win->show_count == 1)
+   if (!elm_widget_focus_order_get(obj))
      {
-        elm_object_focus_set(win->win_obj, EINA_TRUE);
+        elm_widget_focus_steal(win->win_obj);
         win->show_count++;
      }
    else
@@ -323,6 +398,7 @@ _elm_win_focus_in(Ecore_Evas *ee)
    _elm_win_focus_highlight_reconfigure_job_start(win);
    if (win->frame_obj)
      {
+        edje_object_signal_emit(win->frame_obj, "elm,action,focus", "elm");
      }
    else if (win->img_obj)
      {
@@ -346,6 +422,7 @@ _elm_win_focus_out(Ecore_Evas *ee)
    _elm_win_focus_highlight_reconfigure_job_start(win);
    if (win->frame_obj)
      {
+        edje_object_signal_emit(win->frame_obj, "elm,action,unfocus", "elm");
      }
    else if (win->img_obj)
      {
@@ -353,25 +430,171 @@ _elm_win_focus_out(Ecore_Evas *ee)
      }
 }
 
+static void
+_elm_win_profile_update(Ecore_Evas *ee)
+{
+   Evas_Object *obj = ecore_evas_object_associate_get(ee);
+   Elm_Win *win;
+
+   if (!obj) return;
+   win = elm_widget_data_get(obj);
+   if (!win) return;
+
+   if (win->profile.timer)
+     ecore_timer_del(win->profile.timer);
+   win->profile.timer = NULL;
+
+   /* TODO: We need the ability to bind a profile to a specific window.
+    * Elementary's configuration still has a single global profile for the app.
+    */
+   _elm_config_profile_set(win->profile.name);
+
+   evas_object_smart_callback_call(win->win_obj, SIG_PROFILE_CHANGED, NULL);
+}
+
+static Eina_Bool
+_elm_win_profile_change_delay(void *data)
+{
+   Elm_Win *win = data;
+   const char *profile;
+   Eina_Bool changed = EINA_FALSE;
+
+   profile = eina_list_nth(win->profile.names, 0);
+   if (profile)
+     {
+        if (win->profile.name)
+          {
+             if (strcmp(win->profile.name, profile))
+               {
+                  eina_stringshare_replace(&(win->profile.name), profile);
+                  changed = EINA_TRUE;
+               }
+          }
+        else
+          {
+             win->profile.name = eina_stringshare_add(profile);
+             changed = EINA_TRUE;
+          }
+     }
+   win->profile.timer = NULL;
+   if (changed) _elm_win_profile_update(win->ee);
+   return EINA_FALSE;
+}
+
+static void
+_elm_win_state_change(Ecore_Evas *ee)
+{
+   Evas_Object *obj;
+   Elm_Win *win;
+   Eina_Bool ch_withdrawn = EINA_FALSE;
+   Eina_Bool ch_sticky = EINA_FALSE;
+   Eina_Bool ch_iconified = EINA_FALSE;
+   Eina_Bool ch_fullscreen = EINA_FALSE;
+   Eina_Bool ch_maximized = EINA_FALSE;
+   Eina_Bool ch_profile = EINA_FALSE;
+   const char *profile;
+
+   if (!(obj = ecore_evas_object_associate_get(ee))) return;
+
+   if (!(win = elm_widget_data_get(obj))) return;
+
+   if (win->withdrawn != ecore_evas_withdrawn_get(win->ee))
+     {
+        win->withdrawn = ecore_evas_withdrawn_get(win->ee);
+        ch_withdrawn = EINA_TRUE;
+     }
+   if (win->sticky != ecore_evas_sticky_get(win->ee))
+     {
+        win->sticky = ecore_evas_sticky_get(win->ee);
+        ch_sticky = EINA_TRUE;
+     }
+   if (win->iconified != ecore_evas_iconified_get(win->ee))
+     {
+        win->iconified = ecore_evas_iconified_get(win->ee);
+        ch_iconified = EINA_TRUE;
+     }
+   if (win->fullscreen != ecore_evas_fullscreen_get(win->ee))
+     {
+        win->fullscreen = ecore_evas_fullscreen_get(win->ee);
+        ch_fullscreen = EINA_TRUE;
+     }
+   if (win->maximized != ecore_evas_maximized_get(win->ee))
+     {
+        win->maximized = ecore_evas_maximized_get(win->ee);
+        ch_maximized = EINA_TRUE;
+     }
+   profile = ecore_evas_profile_get(win->ee);
+   if ((profile) &&
+       _elm_config_profile_exists(profile))
+     {
+        if (win->profile.name)
+          {
+             if (strcmp(win->profile.name, profile))
+               {
+                  eina_stringshare_replace(&(win->profile.name), profile);
+                  ch_profile = EINA_TRUE;
+               }
+          }
+        else
+          {
+             win->profile.name = eina_stringshare_add(profile);
+             ch_profile = EINA_TRUE;
+          }
+     }
+   if ((ch_withdrawn) || (ch_iconified))
+     {
+        if (win->withdrawn)
+          evas_object_smart_callback_call(win->win_obj, SIG_WITHDRAWN, NULL);
+        else if (win->iconified)
+          evas_object_smart_callback_call(win->win_obj, SIG_ICONIFIED, NULL);
+        else
+          evas_object_smart_callback_call(win->win_obj, SIG_NORMAL, NULL);
+     }
+   if (ch_sticky)
+     {
+        if (win->sticky)
+          evas_object_smart_callback_call(win->win_obj, SIG_STICK, NULL);
+        else
+          evas_object_smart_callback_call(win->win_obj, SIG_UNSTICK, NULL);
+     }
+   if (ch_fullscreen)
+     {
+        if (win->fullscreen)
+          evas_object_smart_callback_call(win->win_obj, SIG_FULLSCREEN, NULL);
+        else
+          evas_object_smart_callback_call(win->win_obj, SIG_UNFULLSCREEN, NULL);
+     }
+   if (ch_maximized)
+     {
+        if (win->maximized)
+          evas_object_smart_callback_call(win->win_obj, SIG_MAXIMIZED, NULL);
+        else
+          evas_object_smart_callback_call(win->win_obj, SIG_UNMAXIMIZED, NULL);
+     }
+   if (ch_profile)
+     {
+        _elm_win_profile_update(win->ee);
+     }
+}
+
 static Eina_Bool
 _elm_win_focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_Object **next)
 {
    Elm_Win *wd = elm_widget_data_get(obj);
    const Eina_List *items;
+   const Eina_List *list;
    void *(*list_data_get) (const Eina_List *list);
 
    if (!wd)
      return EINA_FALSE;
+   list = elm_widget_sub_object_list_get(obj);
 
    /* Focus chain */
-   if (wd->subobjs)
+   if (list)
      {
         if (!(items = elm_widget_focus_custom_chain_get(obj)))
-          {
-             items = wd->subobjs;
-             if (!items)
-               return EINA_FALSE;
-          }
+          items = list;
+
         list_data_get = eina_list_data_get;
 
         elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next);
@@ -379,7 +602,6 @@ _elm_win_focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_O
         if (*next)
           return EINA_TRUE;
      }
-
    *next = (Evas_Object *)obj;
    return EINA_FALSE;
 }
@@ -412,22 +634,22 @@ _elm_win_event_cb(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_T
              return EINA_TRUE;
           }
         else if ((!strcmp(ev->keyname, "Left")) ||
-                 (!strcmp(ev->keyname, "KP_Left")))
+                 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
           {
              //TODO : woohyun jung
           }
         else if ((!strcmp(ev->keyname, "Right")) ||
-                 (!strcmp(ev->keyname, "KP_Right")))
+                 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
           {
              //TODO : woohyun jung
           }
         else if ((!strcmp(ev->keyname, "Up")) ||
-                 (!strcmp(ev->keyname, "KP_Up")))
+                 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
           {
              //TODO : woohyun jung
           }
         else if ((!strcmp(ev->keyname, "Down")) ||
-                 (!strcmp(ev->keyname, "KP_Down")))
+                 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
           {
              //TODO : woohyun jung
           }
@@ -444,7 +666,7 @@ _deferred_ecore_evas_free(void *data)
 }
 
 static void
-_elm_win_obj_callback_show(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_elm_win_obj_callback_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 {
    Elm_Win *win = data;
 
@@ -459,18 +681,32 @@ _elm_win_obj_callback_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UN
 
    if (win->frame_obj)
      {
+        evas_object_hide(win->frame_obj);
      }
    else if (win->img_obj)
      {
         evas_object_hide(win->img_obj);
      }
+   if (win->pointer.obj)
+     {
+        evas_object_hide(win->pointer.obj);
+        ecore_evas_hide(win->pointer.ee);
+     }
+}
+
+static void
+_elm_win_obj_callback_img_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Elm_Win *win = data;
+   win->img_obj = NULL;
 }
 
 static void
 _elm_win_obj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_info __UNUSED__)
 {
    Elm_Win *win = data;
-   Evas_Object *child;
+   Evas_Object *child, *child2 = NULL;
+   const char *str;
 
    if (win->parent)
      {
@@ -492,15 +728,36 @@ _elm_win_obj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_inf
    if (win->shot.timer) ecore_timer_del(win->shot.timer);
    evas_object_event_callback_del_full(win->win_obj, EVAS_CALLBACK_DEL,
                                        _elm_win_obj_callback_del, win);
-   while (((child = evas_object_bottom_get(win->evas))) &&
-          (child != obj))
-     {
-        evas_object_del(child);
-     }
-   while (((child = evas_object_top_get(win->evas))) &&
-          (child != obj))
+   child = evas_object_bottom_get(win->evas);
+   while (child)
      {
-        evas_object_del(child);
+        /* if the object we see *IS* the window object (because we are
+         * faking a parent object inside the canvas), then skip it and
+         * go to the next one */
+        if (child == obj)
+          {
+             child = evas_object_above_get(child);
+             if (!child) break;
+          }
+        /* if we are using the next object above from the previous loop */
+        if (child == child2)
+          {
+             /* this object has refcounts from the previous loop */
+             child2 = evas_object_above_get(child);
+             if (child2) evas_object_ref(child2);
+             evas_object_del(child);
+             /* so unref from previous loop */
+             evas_object_unref(child);
+             child = child2;
+          }
+        else
+          {
+             /* just delete as normal (probably only first object */
+             child2 = evas_object_above_get(child);
+             if (child2) evas_object_ref(child2);
+             evas_object_del(child);
+             child = child2;
+          }
      }
 #ifdef HAVE_ELEMENTARY_X
    if (win->client_message_handler)
@@ -516,6 +773,8 @@ _elm_win_obj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_inf
 
    if (win->img_obj)
      {
+        evas_object_event_callback_del_full
+           (win->img_obj, EVAS_CALLBACK_DEL, _elm_win_obj_callback_img_obj_del, win);
         win->img_obj = NULL;
      }
    else
@@ -530,6 +789,15 @@ _elm_win_obj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_inf
    _elm_win_focus_highlight_shutdown(win);
    eina_stringshare_del(win->focus_highlight.style);
 
+   if (win->title) eina_stringshare_del(win->title);
+   if (win->icon_name) eina_stringshare_del(win->icon_name);
+   if (win->role) eina_stringshare_del(win->role);
+   if (win->icon) evas_object_del(win->icon);
+
+   EINA_LIST_FREE(win->profile.names, str) eina_stringshare_del(str);
+   if (win->profile.name) eina_stringshare_del(win->profile.name);
+   if (win->profile.timer) ecore_timer_del(win->profile.timer);
+
    free(win);
 
    if ((!_elm_win_list) &&
@@ -543,15 +811,6 @@ _elm_win_obj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_inf
      }
 }
 
-static void
-_elm_win_obj_callback_img_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
-{
-   Elm_Win *win = data;
-   if (!win->img_obj) return;
-   evas_object_event_callback_del_full
-      (win->img_obj, EVAS_CALLBACK_DEL, _elm_win_obj_callback_img_obj_del, win);
-   evas_object_del(win->img_obj);
-}
 
 static void
 _elm_win_obj_callback_parent_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
@@ -588,14 +847,21 @@ _elm_win_obj_intercept_show(void *data, Evas_Object *obj)
    // sizes BEFORE we show the window to make sure it initially appears at
    // our desired size (ie min size is known first)
    evas_smart_objects_calculate(evas_object_evas_get(obj));
-   evas_object_show(obj);
    if (win->frame_obj)
      {
+        evas_object_show(win->frame_obj);
      }
    else if (win->img_obj)
      {
         evas_object_show(win->img_obj);
      }
+   if (win->pointer.obj)
+     {
+        ecore_evas_show(win->pointer.ee);
+        evas_object_show(win->pointer.obj);
+        /* ecore_evas_wayland_pointer_set(win->pointer.ee, 10, 10); */
+     }
+   evas_object_show(obj);
 }
 
 static void
@@ -614,6 +880,13 @@ _elm_win_obj_callback_move(void *data, Evas *e __UNUSED__, Evas_Object *obj, voi
      }
    if (win->frame_obj)
      {
+        Evas_Coord x, y;
+
+        evas_object_geometry_get(obj, &x, &y, NULL, NULL);
+        win->screen.x = x;
+        win->screen.y = y;
+
+        /* FIXME: We should update ecore_wl_window_location here !! */
      }
    else if (win->img_obj)
      {
@@ -639,8 +912,6 @@ _elm_win_obj_callback_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj, v
         Evas_Coord w = 1, h = 1;
 
         evas_object_geometry_get(obj, NULL, NULL, &w, &h);
-        if (w < 1) w = 1;
-        if (h < 1) h = 1;
         if (win->constrain)
           {
              int sw, sh;
@@ -648,6 +919,8 @@ _elm_win_obj_callback_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj, v
              w = MIN(w, sw);
              h = MIN(h, sh);
           }
+        if (w < 1) w = 1;
+        if (h < 1) h = 1;
         evas_object_image_size_set(win->img_obj, w, h);
      }
 }
@@ -688,13 +961,14 @@ _elm_win_resize_job(void *data)
         w = MIN(w, sw);
         h = MIN(h, sh);
      }
-   evas_object_resize(win->win_obj, w, h);
    if (win->frame_obj)
      {
+        evas_object_resize(win->frame_obj, w, h);
      }
    else if (win->img_obj)
      {
      }
+   evas_object_resize(win->win_obj, w, h);
    EINA_LIST_FOREACH(win->subobjs, l, obj)
      {
         evas_object_move(obj, 0, 0);
@@ -708,7 +982,7 @@ _elm_win_xwindow_get(Elm_Win *win)
 {
    win->xwin = 0;
 
-#define ENGINE_COMPARE(name) (!strcmp(_elm_config->engine, name))
+#define ENGINE_COMPARE(name) (!strcmp(_elm_preferred_engine, name))
    if (ENGINE_COMPARE(ELM_SOFTWARE_X11))
      {
        if (win->ee) win->xwin = ecore_evas_software_x11_window_get(win->ee);
@@ -752,6 +1026,8 @@ _elm_win_xwindow_get(Elm_Win *win)
 static void
 _elm_win_xwin_update(Elm_Win *win)
 {
+   const char *s;
+
    _elm_win_xwindow_get(win);
    if (win->parent)
      {
@@ -767,6 +1043,60 @@ _elm_win_xwin_update(Elm_Win *win)
 
    if (!win->xwin) return; /* nothing more to do */
 
+   s = win->title;
+   if (!s) s = _elm_appname;
+   if (!s) s = "";
+   if (win->icon_name) s = win->icon_name;
+   ecore_x_icccm_icon_name_set(win->xwin, s);
+   ecore_x_netwm_icon_name_set(win->xwin, s);
+
+   s = win->role;
+   if (s) ecore_x_icccm_window_role_set(win->xwin, s);
+
+   // set window icon
+   if (win->icon)
+     {
+        void *data;
+
+        data = evas_object_image_data_get(win->icon, EINA_FALSE);
+        if (data)
+          {
+             Ecore_X_Icon ic;
+             int w = 0, h = 0, stride, x, y;
+             unsigned char *p;
+             unsigned int *p2;
+
+             evas_object_image_size_get(win->icon, &w, &h);
+             stride = evas_object_image_stride_get(win->icon);
+             if ((w > 0) && (h > 0) &&
+                 (stride >= (int)(w * sizeof(unsigned int))))
+               {
+                  ic.width = w;
+                  ic.height = h;
+                  ic.data = malloc(w * h * sizeof(unsigned int));
+
+                  if (ic.data)
+                    {
+                       p = (unsigned char *)data;
+                       p2 = (unsigned int *)ic.data;
+                       for (y = 0; y < h; y++)
+                         {
+                            for (x = 0; x < w; x++)
+                              {
+                                 *p2 = *((unsigned int *)p);
+                                 p += sizeof(unsigned int);
+                                 p2++;
+                              }
+                            p += (stride - (w * sizeof(unsigned int)));
+                         }
+                       ecore_x_netwm_icons_set(win->xwin, &ic, 1);
+                       free(ic.data);
+                    }
+               }
+             evas_object_image_data_set(win->icon, data);
+          }
+     }
+
    switch (win->type)
      {
       case ELM_WIN_BASIC:
@@ -816,6 +1146,12 @@ _elm_win_xwin_update(Elm_Win *win)
      }
    ecore_x_e_virtual_keyboard_state_set
       (win->xwin, (Ecore_X_Virtual_Keyboard_State)win->kbdmode);
+   if (win->indmode == ELM_WIN_INDICATOR_SHOW)
+     ecore_x_e_illume_indicator_state_set
+     (win->xwin, ECORE_X_ILLUME_INDICATOR_STATE_ON);
+   else if (win->indmode == ELM_WIN_INDICATOR_HIDE)
+     ecore_x_e_illume_indicator_state_set
+     (win->xwin, ECORE_X_ILLUME_INDICATOR_STATE_OFF);
 }
 #endif
 
@@ -1287,6 +1623,132 @@ the_end:
    win->focus_highlight.prev = win->focus_highlight.cur;
 }
 
+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: Wayland handles moving surfaces by itself so we cannot 
+    * specify a specific x/y we want. Instead, we will pass in the 
+    * existing x/y values so they can be recorded as 'previous' position. 
+    * The new position will get updated automatically when the move is 
+    * finished */
+
+   ecore_evas_wayland_move(win->ee, win->screen.x, win->screen.y);
+}
+
+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;
+   win->iconified = EINA_TRUE;
+   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;
+   if (win->maximized) win->maximized = EINA_FALSE;
+   else win->maximized = EINA_TRUE;
+   ecore_evas_maximized_set(win->ee, win->maximized);
+}
+
+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;
+
+   return;
+
+   win->pointer.ee = ecore_evas_wayland_shm_new(NULL, 0, 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);
+   evas_object_move(win->pointer.obj, 0, 0);
+   evas_object_resize(win->pointer.obj, 32, 32);
+   evas_object_show(win->pointer.obj);
+}
+*/
+
 #ifdef ELM_DEBUG
 static void
 _debug_key_down(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
@@ -1296,7 +1758,6 @@ _debug_key_down(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, voi
    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
      return;
 
-
    if ((strcmp(ev->keyname, "F12")) ||
        (!evas_key_modifier_is_set(ev->modifiers, "Control")))
      return;
@@ -1367,6 +1828,26 @@ _win_inlined_image_set(Elm_Win *win)
                                   _win_img_focus_out, win);
 }
 
+static void
+_subobj_del(Elm_Win *win, Evas_Object *obj, Evas_Object *subobj)
+{
+   evas_object_event_callback_del_full(subobj,
+                                       EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+                                       _elm_win_subobj_callback_changed_size_hints,
+                                       obj);
+   evas_object_event_callback_del_full(subobj, EVAS_CALLBACK_DEL,
+                                       _elm_win_subobj_callback_del, obj);
+   win->subobjs = eina_list_remove(win->subobjs, subobj);
+   _elm_win_eval_subobjs(obj);
+}
+
+static void
+_elm_win_obj_icon_callback_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Elm_Win *win = data;
+   if (win->icon == obj) win->icon = NULL;
+}
+
 EAPI Evas_Object *
 elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type)
 {
@@ -1382,9 +1863,12 @@ elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type)
          CRITICAL(engine " engine creation failed. Trying default.");   \
          win->ee = ecore_evas_new(NULL, 0, 0, 1, 1, NULL);              \
          if (win->ee)                                                   \
-            elm_engine_set(ecore_evas_engine_name_get(win->ee));        \
+            elm_config_preferred_engine_set(ecore_evas_engine_name_get(win->ee)); \
    } while (0)
-#define ENGINE_COMPARE(name) (!strcmp(_elm_config->engine, name))
+#define ENGINE_COMPARE(name) (_elm_preferred_engine && !strcmp(_elm_preferred_engine, name))
+
+   win->kbdmode = ELM_WIN_KEYBOARD_UNKNOWN;
+   win->indmode = ELM_WIN_INDICATOR_UNKNOWN;
 
    switch (type)
      {
@@ -1408,6 +1892,11 @@ elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type)
            win->img_obj = NULL;
         }
         break;
+
+      case ELM_WIN_SOCKET_IMAGE:
+        win->ee = ecore_evas_extn_socket_new(1, 1);
+        break;
+
       default:
         if (ENGINE_COMPARE(ELM_SOFTWARE_X11))
           {
@@ -1522,11 +2011,27 @@ elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type)
           {
              win->ee = ecore_evas_ews_new(0, 0, 1, 1);
           }
-        else if (!strncmp(_elm_config->engine, "shot:", 5))
+        else if (ENGINE_COMPARE(ELM_WAYLAND_SHM))
+          {
+             win->ee = ecore_evas_wayland_shm_new(NULL, 0, 0, 0, 1, 1, 0);
+            win->evas = ecore_evas_get(win->ee);
+
+             _elm_win_frame_add(win, "default");
+//             _elm_win_pointer_add(win, "default");
+          }
+        else if (ENGINE_COMPARE(ELM_WAYLAND_EGL))
+          {
+             win->ee = ecore_evas_wayland_egl_new(NULL, 0, 0, 0, 1, 1, 0);
+            win->evas = ecore_evas_get(win->ee);
+
+             _elm_win_frame_add(win, "default");
+//             _elm_win_pointer_add(win, "default");
+          }
+        else if (!strncmp(_elm_preferred_engine, "shot:", 5))
           {
              win->ee = ecore_evas_buffer_new(1, 1);
              ecore_evas_manual_render_set(win->ee, EINA_TRUE);
-             win->shot.info = eina_stringshare_add(_elm_config->engine + 5);
+             win->shot.info = eina_stringshare_add(_elm_preferred_engine + 5);
              _shot_init(win);
           }
 #undef FALLBACK_TRY
@@ -1570,6 +2075,12 @@ elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type)
    evas_object_layer_set(win->win_obj, 50);
    evas_object_pass_events_set(win->win_obj, EINA_TRUE);
 
+   if (win->frame_obj)
+     {
+        evas_object_clip_set(win->win_obj, win->frame_obj);
+        evas_object_stack_below(win->frame_obj, win->win_obj);
+     }
+
    if (type == ELM_WIN_INLINED_IMAGE)
      elm_widget_parent2_set(win->win_obj, parent);
    ecore_evas_object_associate(win->ee, win->win_obj,
@@ -1592,12 +2103,15 @@ elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type)
    evas_object_intercept_show_callback_add(win->win_obj,
                                            _elm_win_obj_intercept_show, win);
 
+   evas_object_smart_callback_add(win->win_obj, "sub-object-del", (Evas_Smart_Cb)_subobj_del, win);
    ecore_evas_name_class_set(win->ee, name, _elm_appname);
    ecore_evas_callback_delete_request_set(win->ee, _elm_win_delete_request);
    ecore_evas_callback_resize_set(win->ee, _elm_win_resize);
+   ecore_evas_callback_mouse_in_set(win->ee, _elm_win_mouse_in);
    ecore_evas_callback_focus_in_set(win->ee, _elm_win_focus_in);
    ecore_evas_callback_focus_out_set(win->ee, _elm_win_focus_out);
    ecore_evas_callback_move_set(win->ee, _elm_win_move);
+   ecore_evas_callback_state_change_set(win->ee, _elm_win_state_change);
    evas_image_cache_set(win->evas, (_elm_config->image_cache * 1024));
    evas_font_cache_set(win->evas, (_elm_config->font_cache * 1024));
    EINA_LIST_FOREACH(_elm_config->font_dirs, l, fontpath)
@@ -1705,8 +2219,11 @@ elm_win_title_set(Evas_Object *obj, const char *title)
    Elm_Win *win;
    ELM_CHECK_WIDTYPE(obj, widtype);
    win = elm_widget_data_get(obj);
-   if (!win) return;
-   ecore_evas_title_set(win->ee, title);
+   if (!win || !title) return;
+   eina_stringshare_replace(&(win->title), title);
+   ecore_evas_title_set(win->ee, win->title);
+   if (win->frame_obj)
+     edje_object_part_text_escaped_set(win->frame_obj, "elm.text.title", win->title);
 }
 
 EAPI const char *
@@ -1716,44 +2233,119 @@ elm_win_title_get(const Evas_Object *obj)
    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
    win = elm_widget_data_get(obj);
    if (!win) return NULL;
-   return ecore_evas_title_get(win->ee);
+   return win->title;
 }
 
 EAPI void
-elm_win_autodel_set(Evas_Object *obj, Eina_Bool autodel)
+elm_win_icon_name_set(Evas_Object *obj, const char *icon_name)
 {
    Elm_Win *win;
    ELM_CHECK_WIDTYPE(obj, widtype);
    win = elm_widget_data_get(obj);
-   if (!win) return;
-   win->autodel = autodel;
+   if (!win || !icon_name) return;
+   eina_stringshare_replace(&(win->icon_name), icon_name);
+#ifdef HAVE_ELEMENTARY_X
+   _elm_win_xwin_update(win);
+#endif
 }
 
-EAPI Eina_Bool
-elm_win_autodel_get(const Evas_Object *obj)
+EAPI const char *
+elm_win_icon_name_get(const Evas_Object *obj)
 {
    Elm_Win *win;
-   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
    win = elm_widget_data_get(obj);
-   if (!win) return EINA_FALSE;
-   return win->autodel;
+   if (!win) return NULL;
+   return win->icon_name;
 }
 
 EAPI void
-elm_win_activate(Evas_Object *obj)
+elm_win_role_set(Evas_Object *obj, const char *role)
 {
    Elm_Win *win;
    ELM_CHECK_WIDTYPE(obj, widtype);
    win = elm_widget_data_get(obj);
-   if (!win) return;
-   ecore_evas_activate(win->ee);
+   if (!win || !role) return;
+   eina_stringshare_replace(&(win->role), role);
+#ifdef HAVE_ELEMENTARY_X
+   _elm_win_xwin_update(win);
+#endif
 }
 
-EAPI void
-elm_win_lower(Evas_Object *obj)
+EAPI const char *
+elm_win_role_get(const Evas_Object *obj)
 {
    Elm_Win *win;
-   ELM_CHECK_WIDTYPE(obj, widtype);
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   win = elm_widget_data_get(obj);
+   if (!win) return NULL;
+   return win->role;
+}
+
+EAPI void
+elm_win_icon_object_set(Evas_Object *obj, Evas_Object *icon)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   win = elm_widget_data_get(obj);
+   if (!win) return;
+   if (win->icon)
+     evas_object_event_callback_del_full(win->icon, EVAS_CALLBACK_DEL,
+                                         _elm_win_obj_icon_callback_del, win);
+   win->icon = icon;
+   if (win->icon)
+     evas_object_event_callback_add(win->icon, EVAS_CALLBACK_DEL,
+                                    _elm_win_obj_icon_callback_del, win);
+#ifdef HAVE_ELEMENTARY_X
+   _elm_win_xwin_update(win);
+#endif
+}
+
+EAPI const Evas_Object *
+elm_win_icon_object_get(const Evas_Object *obj)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   win = elm_widget_data_get(obj);
+   if (!win) return NULL;
+   return win->icon;
+}
+
+EAPI void
+elm_win_autodel_set(Evas_Object *obj, Eina_Bool autodel)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   win = elm_widget_data_get(obj);
+   if (!win) return;
+   win->autodel = autodel;
+}
+
+EAPI Eina_Bool
+elm_win_autodel_get(const Evas_Object *obj)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+   win = elm_widget_data_get(obj);
+   if (!win) return EINA_FALSE;
+   return win->autodel;
+}
+
+EAPI void
+elm_win_activate(Evas_Object *obj)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   win = elm_widget_data_get(obj);
+   if (!win) return;
+   ecore_evas_activate(win->ee);
+}
+
+EAPI void
+elm_win_lower(Evas_Object *obj)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype);
    win = elm_widget_data_get(obj);
    if (!win) return;
    ecore_evas_lower(win->ee);
@@ -1891,46 +2483,6 @@ elm_win_alpha_get(const Evas_Object *obj)
 }
 
 EAPI void
-elm_win_transparent_set(Evas_Object *obj, Eina_Bool transparent)
-{
-   Elm_Win *win;
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   win = elm_widget_data_get(obj);
-   if (!win) return;
-
-   if (win->frame_obj)
-     {
-     }
-   else if (win->img_obj)
-     {
-        evas_object_image_alpha_set(win->img_obj, transparent);
-     }
-   else
-     {
-#ifdef HAVE_ELEMENTARY_X
-        if (win->xwin)
-          {
-             ecore_evas_transparent_set(win->ee, transparent);
-             _elm_win_xwin_update(win);
-          }
-        else
-#endif
-           ecore_evas_transparent_set(win->ee, transparent);
-     }
-}
-
-EAPI Eina_Bool
-elm_win_transparent_get(const Evas_Object *obj)
-{
-   Elm_Win *win;
-   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
-   win = elm_widget_data_get(obj);
-   if (!win) return EINA_FALSE;
-
-   return ecore_evas_transparent_get(win->ee);
-}
-
-EAPI void
 elm_win_override_set(Evas_Object *obj, Eina_Bool override)
 {
    Elm_Win *win;
@@ -1960,9 +2512,8 @@ elm_win_fullscreen_set(Evas_Object *obj, Eina_Bool fullscreen)
    ELM_CHECK_WIDTYPE(obj, widtype);
    win = elm_widget_data_get(obj);
    if (!win) return;
-
    // YYY: handle if win->img_obj
-#define ENGINE_COMPARE(name) (!strcmp(_elm_config->engine, name))
+#define ENGINE_COMPARE(name) (!strcmp(_elm_preferred_engine, name))
    if (ENGINE_COMPARE(ELM_SOFTWARE_FB) ||
        ENGINE_COMPARE(ELM_SOFTWARE_16_WINCE))
      {
@@ -1971,6 +2522,7 @@ elm_win_fullscreen_set(Evas_Object *obj, Eina_Bool fullscreen)
      }
    else
      {
+        win->fullscreen = fullscreen;
         ecore_evas_fullscreen_set(win->ee, fullscreen);
 #ifdef HAVE_ELEMENTARY_X
         _elm_win_xwin_update(win);
@@ -1986,8 +2538,7 @@ elm_win_fullscreen_get(const Evas_Object *obj)
    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
    win = elm_widget_data_get(obj);
    if (!win) return EINA_FALSE;
-
-#define ENGINE_COMPARE(name) (!strcmp(_elm_config->engine, name))
+#define ENGINE_COMPARE(name) (!strcmp(_elm_preferred_engine, name))
    if (ENGINE_COMPARE(ELM_SOFTWARE_FB) ||
        ENGINE_COMPARE(ELM_SOFTWARE_16_WINCE))
      {
@@ -1996,7 +2547,7 @@ elm_win_fullscreen_get(const Evas_Object *obj)
      }
    else
      {
-        return ecore_evas_fullscreen_get(win->ee);
+        return win->fullscreen;
      }
 #undef ENGINE_COMPARE
 }
@@ -2008,6 +2559,7 @@ elm_win_maximized_set(Evas_Object *obj, Eina_Bool maximized)
    ELM_CHECK_WIDTYPE(obj, widtype);
    win = elm_widget_data_get(obj);
    if (!win) return;
+   win->maximized = maximized;
    // YYY: handle if win->img_obj
    ecore_evas_maximized_set(win->ee, maximized);
 #ifdef HAVE_ELEMENTARY_X
@@ -2022,7 +2574,7 @@ elm_win_maximized_get(const Evas_Object *obj)
    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
    win = elm_widget_data_get(obj);
    if (!win) return EINA_FALSE;
-   return ecore_evas_maximized_get(win->ee);
+   return win->maximized;
 }
 
 EAPI void
@@ -2032,6 +2584,7 @@ elm_win_iconified_set(Evas_Object *obj, Eina_Bool iconified)
    ELM_CHECK_WIDTYPE(obj, widtype);
    win = elm_widget_data_get(obj);
    if (!win) return;
+   win->iconified = iconified;
    ecore_evas_iconified_set(win->ee, iconified);
 #ifdef HAVE_ELEMENTARY_X
    _elm_win_xwin_update(win);
@@ -2045,7 +2598,190 @@ elm_win_iconified_get(const Evas_Object *obj)
    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
    win = elm_widget_data_get(obj);
    if (!win) return EINA_FALSE;
-   return ecore_evas_iconified_get(win->ee);
+   return win->iconified;
+}
+
+EAPI void
+elm_win_withdrawn_set(Evas_Object *obj, Eina_Bool withdrawn)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   win = elm_widget_data_get(obj);
+   if (!win) return;
+   win->withdrawn = withdrawn;
+   ecore_evas_withdrawn_set(win->ee, withdrawn);
+#ifdef HAVE_ELEMENTARY_X
+   _elm_win_xwin_update(win);
+#endif
+}
+
+EAPI Eina_Bool
+elm_win_withdrawn_get(const Evas_Object *obj)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+   win = elm_widget_data_get(obj);
+   if (!win) return EINA_FALSE;
+   return win->withdrawn;
+}
+
+EAPI void
+elm_win_profiles_set(Evas_Object *obj, const char **profiles, unsigned int num_profiles)
+{
+   Elm_Win *win;
+   char **profiles_int;
+   const char *str;
+   unsigned int i, num;
+   Eina_List *l;
+
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   win = elm_widget_data_get(obj);
+   if (!win) return;
+   if (!profiles) return;
+
+   if (win->profile.timer) ecore_timer_del(win->profile.timer);
+   win->profile.timer = ecore_timer_add(0.1, _elm_win_profile_change_delay, win);
+   EINA_LIST_FREE(win->profile.names, str) eina_stringshare_del(str);
+
+   for (i = 0; i < num_profiles; i++)
+     {
+        if ((profiles[i]) &&
+            _elm_config_profile_exists(profiles[i]))
+          {
+             str = eina_stringshare_add(profiles[i]);
+             win->profile.names = eina_list_append(win->profile.names, str);
+          }
+     }
+
+   num = eina_list_count(win->profile.names);
+   profiles_int = alloca(num * sizeof(char *));
+
+   if (profiles_int)
+     {
+        i = 0;
+        EINA_LIST_FOREACH(win->profile.names, l, str)
+          {
+             if (str)
+               profiles_int[i] = strdup(str);
+             else
+               profiles_int[i] = NULL;
+             i++;
+          }
+        ecore_evas_profiles_set(win->ee, (const char **)profiles_int, i);
+        for (i = 0; i < num; i++)
+          {
+             if (profiles_int[i]) free(profiles_int[i]);
+          }
+     }
+   else
+     ecore_evas_profiles_set(win->ee, profiles, num_profiles);
+}
+
+EAPI const char *
+elm_win_profile_get(const Evas_Object *obj)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   win = elm_widget_data_get(obj);
+   if (!win) return NULL;
+
+   return win->profile.name;
+}
+
+EAPI void
+elm_win_urgent_set(Evas_Object *obj, Eina_Bool urgent)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   win = elm_widget_data_get(obj);
+   if (!win) return;
+   win->urgent = urgent;
+   ecore_evas_urgent_set(win->ee, urgent);
+#ifdef HAVE_ELEMENTARY_X
+   _elm_win_xwin_update(win);
+#endif
+}
+
+EAPI Eina_Bool
+elm_win_urgent_get(const Evas_Object *obj)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+   win = elm_widget_data_get(obj);
+   if (!win) return EINA_FALSE;
+   return win->urgent;
+}
+
+EAPI void
+elm_win_demand_attention_set(Evas_Object *obj, Eina_Bool demand_attention)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   win = elm_widget_data_get(obj);
+   if (!win) return;
+   win->demand_attention = demand_attention;
+   ecore_evas_demand_attention_set(win->ee, demand_attention);
+#ifdef HAVE_ELEMENTARY_X
+   _elm_win_xwin_update(win);
+#endif
+}
+
+EAPI Eina_Bool
+elm_win_demand_attention_get(const Evas_Object *obj)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+   win = elm_widget_data_get(obj);
+   if (!win) return EINA_FALSE;
+   return win->demand_attention;
+}
+
+EAPI void
+elm_win_modal_set(Evas_Object *obj, Eina_Bool modal)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   win = elm_widget_data_get(obj);
+   if (!win) return;
+   win->modal = modal;
+   ecore_evas_modal_set(win->ee, modal);
+#ifdef HAVE_ELEMENTARY_X
+   _elm_win_xwin_update(win);
+#endif
+}
+
+EAPI Eina_Bool
+elm_win_modal_get(const Evas_Object *obj)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+   win = elm_widget_data_get(obj);
+   if (!win) return EINA_FALSE;
+   return win->modal;
+}
+
+EAPI void
+elm_win_aspect_set(Evas_Object *obj, double aspect)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   win = elm_widget_data_get(obj);
+   if (!win) return;
+   win->aspect = aspect;
+   ecore_evas_aspect_set(win->ee, aspect);
+#ifdef HAVE_ELEMENTARY_X
+   _elm_win_xwin_update(win);
+#endif
+}
+
+EAPI double
+elm_win_aspect_get(const Evas_Object *obj)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+   win = elm_widget_data_get(obj);
+   if (!win) return EINA_FALSE;
+   return win->aspect;
 }
 
 EAPI void
@@ -2124,6 +2860,7 @@ elm_win_sticky_set(Evas_Object *obj, Eina_Bool sticky)
    ELM_CHECK_WIDTYPE(obj, widtype);
    win = elm_widget_data_get(obj);
    if (!win) return;
+   win->sticky = sticky;
    ecore_evas_sticky_set(win->ee, sticky);
 #ifdef HAVE_ELEMENTARY_X
    _elm_win_xwin_update(win);
@@ -2137,7 +2874,7 @@ elm_win_sticky_get(const Evas_Object *obj)
    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
    win = elm_widget_data_get(obj);
    if (!win) return EINA_FALSE;
-   return ecore_evas_sticky_get(win->ee);
+   return win->sticky;
 }
 
 EAPI void
@@ -2200,6 +2937,92 @@ elm_win_keyboard_win_get(const Evas_Object *obj)
    return EINA_FALSE;
 }
 
+// WRAPPER: Temperary added.
+EAPI void
+elm_win_indicator_state_set(Evas_Object *obj, Elm_Win_Indicator_Mode mode)
+{
+   elm_win_indicator_mode_set(obj, mode);
+}
+
+EAPI void
+elm_win_indicator_mode_set(Evas_Object *obj, Elm_Win_Indicator_Mode mode)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   win = elm_widget_data_get(obj);
+   if (!win) return;
+   if (mode == win->indmode) return;
+#ifdef HAVE_ELEMENTARY_X
+   _elm_win_xwindow_get(win);
+#endif
+   win->indmode = mode;
+#ifdef HAVE_ELEMENTARY_X
+   if (win->xwin)
+     {
+        if (win->indmode == ELM_WIN_INDICATOR_SHOW)
+          ecore_x_e_illume_indicator_state_set
+          (win->xwin, ECORE_X_ILLUME_INDICATOR_STATE_ON);
+        else if (win->indmode == ELM_WIN_INDICATOR_HIDE)
+          ecore_x_e_illume_indicator_state_set
+          (win->xwin, ECORE_X_ILLUME_INDICATOR_STATE_OFF);
+     }
+#endif
+}
+
+// WRAPPER: Temperary added.
+EAPI Elm_Win_Indicator_Mode
+elm_win_indicator_state_get(const Evas_Object *obj)
+{
+   return elm_win_indicator_mode_get(obj);
+}
+
+EAPI Elm_Win_Indicator_Mode
+elm_win_indicator_mode_get(const Evas_Object *obj)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype) ELM_WIN_INDICATOR_UNKNOWN;
+   win = elm_widget_data_get(obj);
+   if (!win) return ELM_WIN_INDICATOR_UNKNOWN;
+   return win->indmode;
+}
+
+EAPI void
+elm_win_indicator_opacity_set(Evas_Object *obj, Elm_Win_Indicator_Opacity_Mode mode)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   win = elm_widget_data_get(obj);
+   if (!win) return;
+   if (mode == win->ind_o_mode) return;
+   win->ind_o_mode = mode;
+#ifdef HAVE_ELEMENTARY_X
+   _elm_win_xwindow_get(win);
+   if (win->xwin)
+     {
+        if (win->ind_o_mode == ELM_WIN_INDICATOR_OPAQUE)
+          ecore_x_e_illume_indicator_opacity_set
+          (win->xwin, ECORE_X_ILLUME_INDICATOR_OPAQUE);
+        else if (win->ind_o_mode == ELM_WIN_INDICATOR_TRANSLUCENT)
+          ecore_x_e_illume_indicator_opacity_set
+          (win->xwin, ECORE_X_ILLUME_INDICATOR_TRANSLUCENT);
+        else if (win->ind_o_mode == ELM_WIN_INDICATOR_TRANSPARENT)
+          ecore_x_e_illume_indicator_opacity_set
+          (win->xwin, ECORE_X_ILLUME_INDICATOR_TRANSPARENT);
+
+     }
+#endif
+}
+
+EAPI Elm_Win_Indicator_Opacity_Mode
+elm_win_indicator_opacity_get(const Evas_Object *obj)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype) ELM_WIN_INDICATOR_OPACITY_UNKNOWN;
+   win = elm_widget_data_get(obj);
+   if (!win) return ELM_WIN_INDICATOR_OPACITY_UNKNOWN;
+   return win->ind_o_mode;
+}
+
 EAPI void
 elm_win_screen_position_get(const Evas_Object *obj, int *x, int *y)
 {
@@ -2424,23 +3247,8 @@ elm_win_prop_focus_skip_set(Evas_Object *obj, Eina_Bool skip)
    ELM_CHECK_WIDTYPE(obj, widtype);
    win = elm_widget_data_get(obj);
    if (!win) return;
-#ifdef HAVE_ELEMENTARY_X
-   _elm_win_xwindow_get(win);
-   if (skip)
-     {
-        if (win->xwin)
-          {
-             Ecore_X_Window_State states[2];
-
-             ecore_x_icccm_hints_set(win->xwin, 0, 0, 0, 0, 0, 0, 0);
-             states[0] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
-             states[1] = ECORE_X_WINDOW_STATE_SKIP_PAGER;
-             ecore_x_netwm_window_state_set(win->xwin, states, 2);
-          }
-     }
-#else
-   (void) skip;
-#endif
+   win->skip_focus = skip;
+   ecore_evas_focus_skip_set(win->ee, skip);
 }
 
 EAPI void
@@ -2599,6 +3407,25 @@ _elm_inwin_focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas
 }
 
 static void
+_elm_inwin_text_set_hook(Evas_Object *obj, const char *item, const char *text)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+
+   if (!wd || !item) return;
+   edje_object_part_text_escaped_set(wd->frm, item, text);
+   _sizing_eval(obj);
+}
+
+static const char *
+_elm_inwin_text_get_hook(const Evas_Object *obj, const char *item)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+
+   if (!item || !wd || !wd->frm) return NULL;
+   return edje_object_part_text_get(wd->frm, item);
+}
+
+static void
 _sizing_eval(Evas_Object *obj)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
@@ -2653,6 +3480,8 @@ elm_win_inwin_add(Evas_Object *obj)
    elm_widget_del_hook_set(obj2, _del_hook);
    elm_widget_theme_hook_set(obj2, _theme_hook);
    elm_widget_focus_next_hook_set(obj2, _elm_inwin_focus_next_hook);
+   elm_widget_text_set_hook_set(obj2, _elm_inwin_text_set_hook);
+   elm_widget_text_get_hook_set(obj2, _elm_inwin_text_get_hook);
    elm_widget_can_focus_set(obj2, EINA_TRUE);
    elm_widget_highlight_ignore_set(obj2, EINA_TRUE);
 
@@ -2723,7 +3552,24 @@ elm_win_inwin_content_unset(Evas_Object *obj)
    return content;
 }
 
-/* windowing spcific calls - shall we do this differently? */
+EAPI Eina_Bool
+elm_win_socket_listen(Evas_Object *obj, const char *svcname, int svcnum, Eina_Bool svcsys)
+{
+
+   Elm_Win *win;
+
+   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+   win = elm_widget_data_get(obj);
+   if (!win) return EINA_FALSE;
+   if (!win->ee) return EINA_FALSE;
+
+   if (!ecore_evas_extn_socket_listen(win->ee, svcname, svcnum, svcsys))
+     return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+/* windowing specific calls - shall we do this differently? */
 
 static Ecore_X_Window
 _elm_ee_win_get(const Evas_Object *obj)
@@ -2753,3 +3599,40 @@ elm_win_xwindow_get(const Evas_Object *obj)
 #endif
    return 0;
 }
+
+EAPI void
+elm_win_floating_mode_set(Evas_Object *obj, Eina_Bool floating)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   win = elm_widget_data_get(obj);
+   if (!win) return;
+   if (floating == win->floating) return;
+#ifdef HAVE_ELEMENTARY_X
+   _elm_win_xwindow_get(win);
+#endif
+   win->floating = floating;
+#ifdef HAVE_ELEMENTARY_X
+   if (win->xwin)
+     {
+        if (win->floating)
+          ecore_x_e_illume_window_state_set
+             (win->xwin, ECORE_X_ILLUME_WINDOW_STATE_FLOATING);
+        else
+          ecore_x_e_illume_window_state_set
+             (win->xwin, ECORE_X_ILLUME_WINDOW_STATE_NORMAL);
+     }
+#endif
+}
+
+EAPI Eina_Bool
+elm_win_floating_mode_get(const Evas_Object *obj)
+{
+   Elm_Win *win;
+   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+   win = elm_widget_data_get(obj);
+   if (!win) return EINA_FALSE;
+
+   return win->floating;
+}
+