[mutter] window: Atomically unmaximize both directions from a _NET_WM_STATE ClientMessage



commit 0b003bb89570f3fd3579cb09223206d558fb7bdf
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Mon Jan 13 09:27:46 2014 -0500

    window: Atomically unmaximize both directions from a _NET_WM_STATE ClientMessage
    
    When GDK sends an unmaximize _NET_WM_STATE ClientMessage, it tells us to remove
    the _NET_WM_STATE_MAXIMIZED_HORZ and _NET_WM_STATE_MAXIMIZED_VERT states. Before
    this time, it would independently call:
    
      meta_window_unmaximize (window, META_MAXIMIZE_HORIZONTAL);
      meta_window_unmaximize (window, META_MAXIMIZE_VERTICAL);
    
    Which, besides being foolishly inefficient, would also mess up our saved_rect
    tracking, causing the window to only look like it was unmaximized vertically.
    
    Make this code more intelligent, so it causes us to unmaximize in one call.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=722108

 src/core/window.c |   36 +++++++++++++-----------------------
 1 files changed, 13 insertions(+), 23 deletions(-)
---
diff --git a/src/core/window.c b/src/core/window.c
index b56b17a..0885f03 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -6860,46 +6860,36 @@ meta_window_client_message (MetaWindow *window,
         }
 
       if (first == display->atom__NET_WM_STATE_MAXIMIZED_HORZ ||
-          second == display->atom__NET_WM_STATE_MAXIMIZED_HORZ)
+          second == display->atom__NET_WM_STATE_MAXIMIZED_HORZ ||
+          first == display->atom__NET_WM_STATE_MAXIMIZED_VERT ||
+          second == display->atom__NET_WM_STATE_MAXIMIZED_VERT)
         {
           gboolean max;
+          MetaMaximizeFlags directions = 0;
 
           max = (action == _NET_WM_STATE_ADD ||
                  (action == _NET_WM_STATE_TOGGLE &&
                   !window->maximized_horizontally));
-          if (max && window->has_maximize_func)
-            {
-              if (meta_prefs_get_raise_on_click ())
-                meta_window_raise (window);
-              meta_window_maximize (window, META_MAXIMIZE_HORIZONTAL);
-            }
-          else
-            {
-              if (meta_prefs_get_raise_on_click ())
-                meta_window_raise (window);
-              meta_window_unmaximize (window, META_MAXIMIZE_HORIZONTAL);
-            }
-        }
 
-      if (first == display->atom__NET_WM_STATE_MAXIMIZED_VERT ||
-          second == display->atom__NET_WM_STATE_MAXIMIZED_VERT)
-        {
-          gboolean max;
+          if (first == display->atom__NET_WM_STATE_MAXIMIZED_HORZ ||
+              second == display->atom__NET_WM_STATE_MAXIMIZED_HORZ)
+            directions |= META_MAXIMIZE_HORIZONTAL;
+
+          if (first == display->atom__NET_WM_STATE_MAXIMIZED_VERT ||
+              second == display->atom__NET_WM_STATE_MAXIMIZED_VERT)
+            directions |= META_MAXIMIZE_VERTICAL;
 
-          max = (action == _NET_WM_STATE_ADD ||
-                 (action == _NET_WM_STATE_TOGGLE &&
-                  !window->maximized_vertically));
           if (max && window->has_maximize_func)
             {
               if (meta_prefs_get_raise_on_click ())
                 meta_window_raise (window);
-              meta_window_maximize (window, META_MAXIMIZE_VERTICAL);
+              meta_window_maximize (window, directions);
             }
           else
             {
               if (meta_prefs_get_raise_on_click ())
                 meta_window_raise (window);
-              meta_window_unmaximize (window, META_MAXIMIZE_VERTICAL);
+              meta_window_unmaximize (window, directions);
             }
         }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]