Add APIs for floating mode (app-in-app)
[framework/uifw/elementary.git] / src / lib / elm_win.c
index 8499991..3379763 100644 (file)
@@ -79,6 +79,7 @@ struct _Elm_Win
    Eina_Bool fullscreen : 1;
    Eina_Bool maximized : 1;
    Eina_Bool skip_focus : 1;
+   Eina_Bool floating : 1;
 };
 
 static const char *widtype = NULL;
@@ -172,7 +173,7 @@ _shot_delay_get(Elm_Win *win)
                   *pd = *p;
                }
              *pd = 0;
-             v = atof(d);
+             v = _elm_atof(d);
              free(d);
              return v;
           }
@@ -498,20 +499,19 @@ _elm_win_focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_O
 {
    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);
@@ -519,7 +519,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;
 }
@@ -552,22 +551,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
           }
@@ -616,7 +615,7 @@ 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;
 
    if (win->parent)
      {
@@ -638,15 +637,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))
+   child = evas_object_bottom_get(win->evas);
+   while (child)
      {
-        evas_object_del(child);
-     }
-   while (((child = evas_object_top_get(win->evas))) &&
-          (child != obj))
-     {
-        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)
@@ -777,6 +797,8 @@ _elm_win_obj_callback_move(void *data, Evas *e __UNUSED__, Evas_Object *obj, voi
         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)
      {
@@ -1544,8 +1566,13 @@ _elm_win_frame_cb_move_start(void *data, Evas_Object *obj __UNUSED__, const char
    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);
+   /* 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
@@ -2108,7 +2135,7 @@ elm_win_title_set(Evas_Object *obj, const char *title)
    eina_stringshare_replace(&(win->title), title);
    ecore_evas_title_set(win->ee, win->title);
    if (win->frame_obj)
-     edje_object_part_text_set(win->frame_obj, "elm.text.title", win->title);
+     edje_object_part_text_escaped_set(win->frame_obj, "elm.text.title", win->title);
 }
 
 EAPI const char *
@@ -2759,6 +2786,13 @@ 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)
 {
@@ -2784,6 +2818,13 @@ elm_win_indicator_mode_set(Evas_Object *obj, Elm_Win_Indicator_Mode mode)
 #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)
 {
@@ -3220,7 +3261,7 @@ _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_set(wd->frm, item, text);
+   edje_object_part_text_escaped_set(wd->frm, item, text);
    _sizing_eval(obj);
 }
 
@@ -3371,7 +3412,7 @@ elm_win_socket_listen(Evas_Object *obj, const char *svcname, int svcnum, Eina_Bo
    if (!win) return EINA_FALSE;
    if (!win->ee) return EINA_FALSE;
 
-   if(!ecore_evas_extn_socket_listen(win->ee, svcname, svcnum, svcsys))
+   if (!ecore_evas_extn_socket_listen(win->ee, svcname, svcnum, svcsys))
      return EINA_FALSE;
 
    return EINA_TRUE;
@@ -3407,3 +3448,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;
+}
+