diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c index 9de63c9e1..551e78473 100644 --- a/src/bin/e_comp_x.c +++ b/src/bin/e_comp_x.c @@ -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; } diff --git a/src/bin/e_hints.c b/src/bin/e_hints.c index f42219c56..e017ad7bc 100644 --- a/src/bin/e_hints.c +++ b/src/bin/e_hints.c @@ -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; }