+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;
+
+ 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->x = bd->x; info->y = bd->y;
+ info->w = bd->w; info->h = bd->h;
+ info->win_resize = _e_border_rotation_pre_resize(bd);
+ 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)
+{
+ 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 (SIZE_EQUAL_TO_ZONE(bd, zone)) return resize;
+
+ 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;
+ }
+ 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);
+ }
+ }
+ }
+
+ return resize;
+}
+