batch x11 maximize state change requests

if an app wants to set both horizontal and vertical, set both at the same
time to improve performance and accuracy
This commit is contained in:
Mike Blumenkrantz 2017-08-18 15:52:52 -04:00
parent e27132757c
commit 09a8888f76
2 changed files with 24 additions and 9 deletions

View File

@ -2360,12 +2360,20 @@ _e_comp_x_state_request(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_Ev
{
int i;
E_Client *ec;
int max;
ec = _e_comp_x_client_find_by_window(ev->win);
if (!ec) return ECORE_CALLBACK_RENEW;
for (i = 0; i < 2; i++)
e_hints_window_state_update(ec, ev->state[i], ev->action);
max = (1 << ev->state[0]) | (1 << ev->state[1]);
if ((max & (1 << ECORE_X_WINDOW_STATE_MAXIMIZED_VERT)) &&
(max & (1 << ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ)))
e_hints_window_state_update(ec, INT_MAX, ev->action);
else
{
for (i = 0; i < 2; i++)
e_hints_window_state_update(ec, ev->state[i], ev->action);
}
return ECORE_CALLBACK_RENEW;
}

View File

@ -792,37 +792,44 @@ e_hints_window_state_update(E_Client *ec, int state, int action)
case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
case INT_MAX:
{
E_Maximize max[] =
{
[ECORE_X_WINDOW_STATE_MAXIMIZED_VERT] = E_MAXIMIZE_VERTICAL,
[ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ] = E_MAXIMIZE_HORIZONTAL,
};
E_Maximize m;
if (state > ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ)
m = E_MAXIMIZE_BOTH;
else
m = max[state];
if (ec->lock_client_maximize) return;
switch (action)
{
case ECORE_X_WINDOW_STATE_ACTION_REMOVE:
if ((ec->maximized & max[state]) == max[state])
e_client_unmaximize(ec, max[state]);
if ((ec->maximized & m) == m)
e_client_unmaximize(ec, m);
break;
case ECORE_X_WINDOW_STATE_ACTION_ADD:
if ((ec->maximized & max[state]) == max[state]) break;
if ((ec->maximized & m) == m) break;
ec->changes.need_maximize = 1;
ec->maximized &= ~E_MAXIMIZE_TYPE;
ec->maximized |= (e_config->maximize_policy & E_MAXIMIZE_TYPE) | max[state];
ec->maximized |= (e_config->maximize_policy & E_MAXIMIZE_TYPE) | m;
EC_CHANGED(ec);
break;
case ECORE_X_WINDOW_STATE_ACTION_TOGGLE:
if ((ec->maximized & max[state]) == max[state])
if ((ec->maximized & m) == m)
{
e_client_unmaximize(ec, max[state]);
e_client_unmaximize(ec, m);
break;
}
ec->changes.need_maximize = 1;
ec->maximized &= ~E_MAXIMIZE_TYPE;
ec->maximized |= (e_config->maximize_policy & E_MAXIMIZE_TYPE) | max[state];
ec->maximized |= (e_config->maximize_policy & E_MAXIMIZE_TYPE) | m;
EC_CHANGED(ec);
break;
}