_e_client_frame_update(ec);
evas_object_smart_callback_call(ec->frame, "unmaximize", NULL);
e_client_resize_limit(ec, &w, &h);
- e_client_util_move_resize_without_frame(ec, x, y, w, h);
+ e_policy_visibility_client_defer_move(ec, x, y);
e_hints_window_size_unset(ec);
}
else
{
evas_object_smart_callback_call(ec->frame, "unmaximize", NULL);
e_client_resize_limit(ec, &w, &h);
- e_client_util_move_resize_without_frame(ec, x, y, w, h);
+ e_policy_visibility_client_defer_move(ec, x, y);
e_hints_window_size_set(ec);
}
if (vert)
return EINA_TRUE;
}
+static Eina_Bool
+_e_vis_client_defer_move(E_Vis_Client *vc, E_Vis_Job_Type type, int x, int y)
+{
+ if (!vc) return EINA_FALSE;
+
+ vc->state = E_VIS_ICONIFY_STATE_GEOMETRY_CHANGE;
+ vc->grab = _e_vis_client_grab_get(vc, __func__);
+ vc->defer.x = x;
+ vc->defer.y = y;
+ _e_vis_client_buffer_attach_handler_add(vc);
+
+ _e_vis_client_job_add(vc, type);
+
+ return EINA_TRUE;
+}
+
static inline Eina_Bool
_e_vis_ec_special_check(E_Client *ec)
{
{
VS_DBG(ec, "Job Run: type %d", type);
+ E_Vis_Client *vc = NULL;
+ if (ec) {
+ if (EINA_LIKELY(pol_vis != NULL)) {
+ vc = eina_hash_find(pol_vis->clients_hash, &ec);
+ }
+ }
+
switch (type)
{
case E_VIS_JOB_TYPE_ACTIVATE:
break;
case E_VIS_JOB_TYPE_LAYER_LOWER:
e_comp_canvas_norender_pop();
- E_VIS_CLIENT_GET(vc, ec);
- if (vc)
- evas_object_layer_set(ec->frame, vc->layer);
+ if (vc) evas_object_layer_set(ec->frame, vc->layer);
break;
case E_VIS_JOB_TYPE_SHOW:
/* checks for dectecting hide request after show request */
(!ec->iconic) && (!ec->ignored))
evas_object_show(ec->frame);
break;
+ case E_VIS_JOB_TYPE_DEFER_MOVE:
+ /* handle defered job regarding move */
+ if (vc &&(!e_object_is_del(E_OBJECT(ec))) &&
+ (ec->visible) && (!ec->hidden) &&
+ (!ec->iconic) && (!ec->ignored))
+ evas_object_move(ec->frame, vc->defer.x, vc->defer.y);
+ break;
+
default:
VS_ERR(ec, "Unkown job type: %d", type);
break;
vc->disable_uniconify_render = !!disable;
}
+E_API void
+e_policy_visibility_client_defer_move(E_Client *ec, int x, int y)
+{
+ E_VIS_CLIENT_GET_OR_RETURN(vc, ec);
+ VS_DBG(ec, "API ENTRY | Defered Move");
+
+ _e_vis_client_defer_move(vc, E_VIS_JOB_TYPE_DEFER_MOVE, x, y);
+}
+
E_API Eina_Bool
e_policy_visibility_init(void)
{
E_VIS_ICONIFY_STATE_ICONIC,
E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY,
E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY_WAITING_FOR_CHILD,
+ E_VIS_ICONIFY_STATE_GEOMETRY_CHANGE,
} E_Vis_Iconify_State;
typedef enum
E_VIS_JOB_TYPE_UNICONIFY,
E_VIS_JOB_TYPE_UNICONIFY_BY_VISIBILITY,
E_VIS_JOB_TYPE_LAYER_LOWER,
+ E_VIS_JOB_TYPE_DEFER_MOVE,
} E_Vis_Job_Type;
/* external data structure */
Eina_Bool prepare_emitted;
Eina_Bool disable_uniconify_render;
E_Layer layer;
+
+ struct
+ {
+ int x, y, w, h;
+ } defer;
};
struct _E_Vis_Job_Group