From 1a2f4087dbd96641e2b36c864d5e95d0fdf5ff36 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 10 Mar 2014 00:26:06 -0400 Subject: [PATCH] defer netwm maximize hint apply to reduce canvas ops improves maximize performance on apps like chromium which incrementally apply maximize states --- src/bin/e_hints.c | 73 +++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 40 deletions(-) diff --git a/src/bin/e_hints.c b/src/bin/e_hints.c index e0986cee9..419121c44 100644 --- a/src/bin/e_hints.c +++ b/src/bin/e_hints.c @@ -780,49 +780,42 @@ e_hints_window_state_update(E_Client *ec, break; case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT: - if (ec->lock_client_maximize) return; - switch (action) - { - case ECORE_X_WINDOW_STATE_ACTION_REMOVE: - if (ec->maximized & E_MAXIMIZE_VERTICAL) - e_client_unmaximize(ec, E_MAXIMIZE_VERTICAL); - break; - - case ECORE_X_WINDOW_STATE_ACTION_ADD: - if (!(ec->maximized & E_MAXIMIZE_VERTICAL)) - e_client_maximize(ec, (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_VERTICAL); - break; - - case ECORE_X_WINDOW_STATE_ACTION_TOGGLE: - if (ec->maximized & E_MAXIMIZE_VERTICAL) - e_client_unmaximize(ec, E_MAXIMIZE_VERTICAL); - else - e_client_maximize(ec, (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_VERTICAL); - break; - } - break; - case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ: - if (ec->lock_client_maximize) return; - switch (action) - { - case ECORE_X_WINDOW_STATE_ACTION_REMOVE: - if (ec->maximized & E_MAXIMIZE_HORIZONTAL) - e_client_unmaximize(ec, E_MAXIMIZE_HORIZONTAL); - break; + { + E_Maximize max[] = + { + [ECORE_X_WINDOW_STATE_MAXIMIZED_VERT] = E_MAXIMIZE_VERTICAL, + [ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ] = E_MAXIMIZE_HORIZONTAL, + }; + if (ec->lock_client_maximize) return; + switch (action) + { + case ECORE_X_WINDOW_STATE_ACTION_REMOVE: + if (ec->maximized & max[state]) + e_client_unmaximize(ec, E_MAXIMIZE_VERTICAL); + break; - case ECORE_X_WINDOW_STATE_ACTION_ADD: - if (!(ec->maximized & E_MAXIMIZE_HORIZONTAL)) - e_client_maximize(ec, (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_HORIZONTAL); - break; + case ECORE_X_WINDOW_STATE_ACTION_ADD: + if (ec->maximized & max[state]) break; + ec->changes.need_maximize = 1; + ec->maximized &= ~E_MAXIMIZE_TYPE; + ec->maximized |= (e_config->maximize_policy & E_MAXIMIZE_TYPE) | max[state]; + EC_CHANGED(ec); + break; - case ECORE_X_WINDOW_STATE_ACTION_TOGGLE: - if (ec->maximized & E_MAXIMIZE_HORIZONTAL) - e_client_unmaximize(ec, E_MAXIMIZE_HORIZONTAL); - else - e_client_maximize(ec, (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_HORIZONTAL); - break; - } + case ECORE_X_WINDOW_STATE_ACTION_TOGGLE: + if (ec->maximized & max[state]) + { + e_client_unmaximize(ec, max[state]); + break; + } + ec->changes.need_maximize = 1; + ec->maximized &= ~E_MAXIMIZE_TYPE; + ec->maximized |= (e_config->maximize_policy & E_MAXIMIZE_TYPE) | max[state]; + EC_CHANGED(ec); + break; + } + } break; case ECORE_X_WINDOW_STATE_SHADED: