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);
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)
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)
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.
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)
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);
}
((((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;
}
#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);