+static Eina_Bool
+_rot_eval_fetch_preferred_send_angle_change(Policy_Ext_Rotation *rot)
+{
+ E_Client *ec;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(rot, EINA_FALSE);
+
+ ec = rot->ec;
+ if (!ec)
+ return EINA_FALSE;
+
+ if (!rot->preferred_angle)
+ return EINA_FALSE;
+
+ /* for clients supporting landscape mode only */
+ if (!(rot->preferred_angle & TIZEN_ROTATION_ANGLE_0) &&
+ !(rot->preferred_angle & TIZEN_ROTATION_ANGLE_180))
+ {
+ enum tizen_rotation_angle tz_angle = 0;
+ uint32_t serial;
+ Eina_List *l;
+ struct wl_resource *res;
+
+ if (rot->available_angles & TIZEN_ROTATION_ANGLE_90)
+ tz_angle = TIZEN_ROTATION_ANGLE_90;
+ else if (rot->available_angles & TIZEN_ROTATION_ANGLE_270)
+ tz_angle = TIZEN_ROTATION_ANGLE_270;
+ else
+ {
+ ERR("What's this impossible angle?? : %d", rot->preferred_angle);
+ }
+
+ if (tz_angle)
+ {
+ serial = wl_display_next_serial(e_comp_wl->wl.disp);
+
+ rot->angle_change_done = EINA_FALSE;
+ rot->prev_angle = rot->cur_angle;
+ rot->cur_angle = tz_angle;
+ rot->serial = serial;
+
+ EDBG(ec, "Send Change Rotation: angle %d for rendering preparation of landscape mode only app. mapped:%d serial:%u",
+ tz_angle, ec->first_mapped, serial);
+
+ ec->e.state.rot.ang.next = TIZEN_ROTATION_ANGLE_TO_INT(tz_angle);
+
+ EINA_LIST_FOREACH(rot->rotation_list, l, res)
+ {
+ tizen_rotation_send_angle_change(res, tz_angle, serial);
+ }
+ return EINA_TRUE;
+ }
+ }
+
+ return EINA_FALSE;
+}
+
+static Eina_Bool
+_rot_eval_fetch_available_send_angle_change(Policy_Ext_Rotation *rot)
+{
+ enum tizen_rotation_angle cur_tz_angle;
+ E_Client *ec;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(rot, EINA_FALSE);
+
+ ec = rot->ec;
+ if (!ec)
+ return EINA_FALSE;
+
+ if (!rot->available_angles)
+ return EINA_FALSE;
+
+ cur_tz_angle = INT_TO_TIZEN_ROTATION_ANGLE(ec->e.state.rot.ang.curr);
+ if (rot->available_angles & cur_tz_angle)
+ {
+ EDBG(ec, "Ignore it. current angle(%d) is one of available angles.", cur_tz_angle);
+ return EINA_FALSE;
+ }
+
+ /* for clients supporting landscape mode only */
+ if (!(rot->available_angles & TIZEN_ROTATION_ANGLE_0) &&
+ !(rot->available_angles & TIZEN_ROTATION_ANGLE_180))
+ {
+ enum tizen_rotation_angle tz_angle = 0;
+ uint32_t serial;
+ Eina_List *l;
+ struct wl_resource *res;
+
+ if (rot->available_angles & TIZEN_ROTATION_ANGLE_90)
+ tz_angle = TIZEN_ROTATION_ANGLE_90;
+ else if (rot->available_angles & TIZEN_ROTATION_ANGLE_270)
+ tz_angle = TIZEN_ROTATION_ANGLE_270;
+ else
+ {
+ ERR("What's this impossible angle?? : %d", rot->available_angles);
+ }
+
+ if (tz_angle)
+ {
+ /* if the client requests a window rotation with the same value as the current angle, just ignore it. */
+ if ((ec->first_mapped) &&
+ (ec->e.state.rot.ang.curr == TIZEN_ROTATION_ANGLE_TO_INT(tz_angle)))
+ {
+ EDBG(ec, "Ignore it. given angle %d is same as the current angle for landscape only app.",
+ tz_angle);
+ return EINA_FALSE;
+ }
+
+ serial = wl_display_next_serial(e_comp_wl->wl.disp);
+
+ rot->angle_change_done = EINA_FALSE;
+ rot->prev_angle = rot->cur_angle;
+ rot->cur_angle = tz_angle;
+ rot->serial = serial;
+
+ EDBG(ec, "Send Change Rotation: angle %d for redering preparation of landscape only app. mapped:%d serial:%u",
+ tz_angle, ec->first_mapped, serial);
+
+ ec->e.state.rot.ang.next = TIZEN_ROTATION_ANGLE_TO_INT(tz_angle);
+
+ EINA_LIST_FOREACH(rot->rotation_list, l, res)
+ {
+ tizen_rotation_send_angle_change(res, tz_angle, serial);
+ }
+ return EINA_TRUE;
+ }
+ }
+ return EINA_FALSE;
+}
+