}
/* TODO: enable user geometry? */
- e_policy_allow_user_geometry_set(ec, EINA_TRUE);
+ e_policy_user_geometry_set(ec, E_POLICY_USERGEOM_RSM, EINA_TRUE);
_remote_surface_bind_client_set(remote_surface, ec);
eina_hash_add(_rsm->bind_surface_hash, &remote_surface->bind_ec, remote_surface);
}
E_API void
-e_policy_allow_user_geometry_set(E_Client *ec, Eina_Bool set)
+e_policy_user_geometry_set(E_Client *ec,
+ E_Policy_Allow_User_Geometry type,
+ Eina_Bool set)
{
E_Policy_Client *pc;
if (EINA_UNLIKELY(!pc))
return;
- if (set) pc->user_geom_ref++;
- else pc->user_geom_ref--;
+ if (set)
+ pc->user_geom_state |= type;
+ else
+ pc->user_geom_state &= ~(type);
+
+ if (pc->user_geom_state)
+ e_policy_allow_user_geometry_set(ec, EINA_TRUE);
+ else
+ e_policy_allow_user_geometry_set(ec, EINA_FALSE);
+}
+
+E_API void
+e_policy_allow_user_geometry_set(E_Client *ec, Eina_Bool set)
+{
+ E_Policy_Client *pc;
+
+ if (EINA_UNLIKELY(!ec))
+ return;
+
+ pc = eina_hash_find(hash_policy_clients, &ec);
+ if (EINA_UNLIKELY(!pc))
+ return;
- if (pc->user_geom_ref == 1 && !pc->allow_user_geom)
+ if (set && !pc->allow_user_geom)
{
pc->allow_user_geom = EINA_TRUE;
_e_policy_client_maximize_policy_cancel(pc);
EC_CHANGED(ec);
}
- else if (pc->user_geom_ref == 0 && pc->allow_user_geom)
+ else if (!set && pc->allow_user_geom)
{
pc->allow_user_geom = EINA_FALSE;
E_POLICY_ANIMATABLE_CUSTOMIZED = (1 << 3), // no animation by app customized animation
} E_Policy_Animatable_Lock;
+typedef enum {
+ E_POLICY_USERGEOM_WTYPE = (1 << 0), // set by client if netwm.type == E_WINDOW_TYPE_UTILITY
+ E_POLICY_USERGEOM_HINT = (1 << 1), // set by client aux hint request if "wm.policy.win.user.geometry" is "1"
+ E_POLICY_USERGEOM_RSM = (1 << 2), // set if window works as remote surface provider
+ E_POLICY_USERGEOM_SERVICE = (1 << 3), // set if window works as special service provider (e.g quickpanel client)
+} E_Policy_Allow_User_Geometry;
+
typedef Eina_Bool (*E_Policy_Intercept_Cb)(void *data, E_Client *ec, va_list list);
typedef void (*E_Policy_Hook_Cb)(void *data, E_Client *ec);
Eina_Bool flt_policy_state;
Eina_Bool allow_user_geom;
Eina_Bool split_policy_state;
- int user_geom_ref;
+ int user_geom_state;
unsigned int lock_animatable;
};
E_API void e_policy_hook_del(E_Policy_Hook *hook);
E_API Eina_Bool e_policy_hook_call(E_Policy_Hook_Point hookpoint, E_Client *ec);
+E_API void e_policy_user_geometry_set(E_Client *ec, E_Policy_Allow_User_Geometry type, Eina_Bool set);
E_API void e_policy_allow_user_geometry_set(E_Client *ec, Eina_Bool set);
E_API Eina_Bool e_policy_allow_user_geometry_get(E_Client *ec);
E_API void e_policy_deferred_job(void);
{
if (hint->deleted)
{
- e_policy_allow_user_geometry_set(ec, EINA_FALSE);
+ e_policy_user_geometry_set(ec, E_POLICY_USERGEOM_HINT, EINA_FALSE);
continue;
}
if (!strcmp(hint->val, "1"))
{
- e_policy_allow_user_geometry_set(ec, EINA_TRUE);
+ e_policy_user_geometry_set(ec, E_POLICY_USERGEOM_HINT, EINA_TRUE);
}
else if (strcmp(hint->val, "1"))
{
- e_policy_allow_user_geometry_set(ec, EINA_FALSE);
+ e_policy_user_geometry_set(ec, E_POLICY_USERGEOM_HINT, EINA_FALSE);
}
}
else if (!strcmp(hint->hint, hint_names[E_POLICY_HINT_FIXED_RESIZE]))
{
case E_SERVICE_QUICKPANEL_EFFECT_TYPE_SWIPE:
ec->lock_client_location = 1;
- e_policy_allow_user_geometry_set(ec, EINA_FALSE);
+ e_policy_user_geometry_set(ec, E_POLICY_USERGEOM_SERVICE, EINA_FALSE);
if ((ec->maximized == E_MAXIMIZE_NONE) &&
(qp->saved_maximize != E_MAXIMIZE_NONE))
e_client_maximize(ec, qp->saved_maximize);
break;
case E_SERVICE_QUICKPANEL_EFFECT_TYPE_MOVE:
ec->lock_client_location = 0;
- e_policy_allow_user_geometry_set(ec, EINA_TRUE);
+ e_policy_user_geometry_set(ec, E_POLICY_USERGEOM_SERVICE, EINA_TRUE);
if (ec->maximized != E_MAXIMIZE_NONE)
{
qp->saved_maximize = ec->maximized;