In the case of sending rotation like message before illume's layout hook handler...
[platform/core/uifw/e17.git] / src / bin / e_border.c
index 9654569..843e418 100644 (file)
@@ -166,7 +166,7 @@ static Eina_Bool _e_border_rotation_geom_get(E_Border  *bd,
                                              Eina_Bool *move);
 static Eina_Bool _e_border_rotation_start(E_Zone *zone, Eina_Bool without_vkbd);
 static void      _e_border_rotation_list_remove(E_Border *bd);
-static Eina_Bool _e_border_rotation_pre_resize(E_Border *bd);
+static Eina_Bool _e_border_rotation_pre_resize(E_Border *bd, int *x, int *y, int *w, int *h);
 static Eina_Bool _e_border_rotation_check(E_Border *bd);
 static Eina_Bool _e_border_rotation_zone_check(E_Zone *zone);
 static Eina_Bool _e_border_rotation_border_check(E_Border *bd, int ang);
@@ -2024,8 +2024,18 @@ _e_border_move_resize_internal(E_Border *bd,
 
    if (bd->new_client)
      {
-        _e_border_pending_move_resize_add(bd, move, 1, x, y, w, h, without_border, 0);
-        return;
+        /* FIXME: hack for resizing vkbd like window.
+         * IT SHOULD BE REMOVED after move the code which set the geometry of vkbd like window
+         * to illume's layout hook handler.
+         * the job of pending move/resize wouldn't be processed,
+         * in case this function is called from "_e_border_rotation_check" via "e_hints_window_init".
+         * thus we have to move/resize directry without pending in case geometry hint is existed. */
+        if (!_e_border_rotation_geom_get(bd, bd->zone, bd->client.e.state.rot.curr,
+                                         NULL, NULL, NULL, NULL, NULL))
+          {
+             _e_border_pending_move_resize_add(bd, move, 1, x, y, w, h, without_border, 0);
+             return;
+          }
      }
 
    if (bd->maximized)
@@ -5860,11 +5870,22 @@ _e_border_cb_window_show_request(void *data  __UNUSED__,
                                  void       *ev)
 {
    E_Border *bd;
+   E_Container *con;
    Ecore_X_Event_Window_Show_Request *e;
 
    e = ev;
    bd = e_border_find_by_client_window(e->win);
    if (!bd) return ECORE_CALLBACK_PASS_ON;
+
+   if ((e_config->wm_win_rotation) &&
+       (rot.vkbd_ctrl_win) && (rot.vkbd) &&
+       (bd == rot.vkbd) &&
+       (rot.vkbd_hide_prepare_timer))
+     {
+        con = bd->zone->container;
+        bd = e_border_new(con, e->win, 0, 0);
+     }
+
    if (bd->iconic)
      {
         if (!bd->lock_client_iconify)
@@ -8286,7 +8307,11 @@ _e_border_rotation_check(E_Border *bd)
 
    hint = _e_border_rotation_geom_get(bd, zone, ang, &x, &y, &w, &h, &move);
    if (hint)
-     _e_border_move_resize_internal(bd, x, y, w, h, EINA_TRUE, move);
+     {
+        _e_border_move_resize_internal(bd, x, y, w, h, EINA_TRUE, move);
+        ELBF(ELBT_ROT, 0, bd->client.win, "RESIZE_BY_HINT name:%s (%d,%d) %dx%d",
+             bd->client.icccm.name, x, y, w, h);
+     }
 
    /* need to check previous rotation angle, this may be because
     * the window was unmapped with non-0 rotation degree.
@@ -8522,6 +8547,7 @@ e_border_rotation_list_add(Eina_List *list)
    Eina_List *l;
    E_Border *bd = NULL;
    E_Border_Rotation_Info *info = NULL;
+   int x=0, y=0, w=0, h=0;
 
    if (!list) return EINA_FALSE;
    EINA_LIST_FOREACH(list, l, bd)
@@ -8531,9 +8557,9 @@ e_border_rotation_list_add(Eina_List *list)
 
         info->bd = bd;
         info->ang = bd->client.e.state.rot.curr;
-        info->x = bd->x; info->y = bd->y;
-        info->w = bd->w; info->h = bd->h;
-        info->win_resize = _e_border_rotation_pre_resize(bd);
+        info->win_resize = _e_border_rotation_pre_resize(bd, &x, &y, &w, &h);
+        info->x = x; info->y = y;
+        info->w = w; info->h = h;
         if (info->win_resize) bd->client.e.state.rot.pending_change_request = 1;
         rot.list = eina_list_append(rot.list, info);
      }
@@ -8545,44 +8571,66 @@ e_border_rotation_list_add(Eina_List *list)
    ((((a)->w) == ((z)->w)) &&    \
     (((a)->h) == ((z)->h)))
 static Eina_Bool
-_e_border_rotation_pre_resize(E_Border *bd)
+_e_border_rotation_pre_resize(E_Border *bd, int *x, int *y, int *w, int *h)
 {
    E_Zone *zone = bd->zone;
    int ang = bd->client.e.state.rot.curr;
    int diff = ang - bd->client.e.state.rot.prev;
-   int x, y, w, h;
+   int _x, _y, _w, _h;
    Eina_Bool move = EINA_FALSE;
    Eina_Bool hint = EINA_FALSE;
    Eina_Bool resize = EINA_FALSE;
 
+   if (x) *x = bd->x;
+   if (y) *y = bd->y;
+   if (w) *w = bd->w;
+   if (h) *h = bd->h;
+
    if (SIZE_EQUAL_TO_ZONE(bd, zone)) return resize;
 
+   ELB(ELBT_ROT, "SIZE DIFF WITH ZONE", 0);
+   ELBF(ELBT_ROT, 0, bd->client.win, "ORIGIN_SIZE name:%s (%d,%d) %dx%d",
+        bd->client.icccm.name, bd->x, bd->y, bd->w, bd->h);
+
    hint = _e_border_rotation_geom_get(bd, bd->zone, ang,
-                                      &x, &y, &w, &h, &move);
+                                      &_x, &_y, &_w, &_h, &move);
    if (hint)
      {
-        _e_border_move_resize_internal(bd, x, y, w, h, EINA_TRUE, move);
+        _e_border_move_resize_internal(bd, _x, _y, _w, _h, EINA_TRUE, move);
         resize = EINA_TRUE;
+        ELBF(ELBT_ROT, 0, bd->client.win, "RESIZE_BY_HINT name:%s (%d,%d) %dx%d",
+             bd->client.icccm.name, _x, _y, _w, _h);
      }
    else
      {
-        x = bd->x; y = bd->y;
-        w = bd->w; h = bd->h;
+        _x = bd->x; _y = bd->y;
+        _w = bd->w; _h = bd->h;
 
         if ((diff != 180) && (diff != -180))
           {
              if (w != h)
                {
-                  w = bd->h;
-                  h = bd->w;
+                  _w = bd->h;
+                  _h = bd->w;
                   resize = EINA_TRUE;
 
-                  _e_border_move_resize_internal(bd, x, y, w, h,
+                  _e_border_move_resize_internal(bd, _x, _y, _w, _h,
                                                  EINA_TRUE, EINA_TRUE);
+                  ELBF(ELBT_ROT, 0, bd->client.win, "MANUAL_RESIZE name:%s (%d,%d) %dx%d",
+                       bd->client.icccm.name, _x, _y, _w, _h);
+
                }
           }
      }
 
+   if (resize)
+     {
+        if (x) *x = _x;
+        if (y) *y = _y;
+        if (w) *w = _w;
+        if (h) *h = _h;
+     }
+
    return resize;
 }
 
@@ -10059,7 +10107,13 @@ _e_border_eval0(E_Border *bd)
 #endif
 #ifdef _F_ZONE_WINDOW_ROTATION_
    if ((e_config->wm_win_rotation) &&
-       (need_rotation_set))
+       (need_rotation_set) &&
+       /* since this parts of code is processed before illume's layout hook handler is processed,
+        * this border could be non-fullsize window at this time.
+        * in this case, if we send rotation like message to window,
+        * that window could have abnormal geometry.
+        * so, we skip it in case new_client for now.*/
+       (!bd->new_client))
      {
         ELB(ELBT_ROT, "NEED ROT", bd->client.win);
         Eina_Bool _rot = _e_border_rotation_check(bd);