discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=09a8888f767f72e7d339be5b66c8a4709a1a0aee

commit 09a8888f767f72e7d339be5b66c8a4709a1a0aee
Author: Mike Blumenkrantz <zm...@osg.samsung.com>
Date:   Fri Aug 18 15:52:52 2017 -0400

    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
---
 src/bin/e_comp_x.c | 12 ++++++++++--
 src/bin/e_hints.c  | 21 ++++++++++++++-------
 2 files changed, 24 insertions(+), 9 deletions(-)

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;
            }

-- 


Reply via email to