+EAPI Eina_Bool
+e_border_rotation_list_add_change_req(E_Zone *zone, Eina_List *list)
+{
+ Eina_List *l;
+ E_Border *bd;
+ Eina_Bool ret = EINA_FALSE;
+
+ if (e_border_rotation_list_add(list))
+ {
+ EINA_LIST_FOREACH(list, l, bd)
+ _e_border_hook_call(E_BORDER_HOOK_ROTATION_LIST_ADD, bd);
+ _e_border_rotation_change_request(zone);
+ ret = EINA_TRUE;
+ }
+
+ return ret;
+}
+
+EAPI Eina_Bool
+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)
+ {
+ info = E_NEW(E_Border_Rotation_Info, 1);
+ if (!info) continue;
+
+ info->bd = bd;
+ info->ang = bd->client.e.state.rot.curr;
+ 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);
+ }
+
+ return EINA_TRUE;
+}
+
+#define SIZE_EQUAL_TO_ZONE(a, z) \
+ ((((a)->w) == ((z)->w)) && \
+ (((a)->h) == ((z)->h)))
+static Eina_Bool
+_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;
+ 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);
+ if (hint)
+ {
+ _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;
+
+ if ((diff != 180) && (diff != -180))
+ {
+ if (w != h)
+ {
+ _w = bd->h;
+ _h = bd->w;
+ resize = EINA_TRUE;
+
+ _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;
+}
+