From 7a4adce44f2fe8cf51a61eb984c62ca0a9fb3793 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Mon, 13 Jan 2014 09:27:46 -0500 Subject: [PATCH] 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 | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/src/core/window.c b/src/core/window.c index 1ff6e0e3d..4b05d4e3f 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -7143,46 +7143,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 (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; + if (max && window->has_maximize_func) { if (meta_prefs_get_raise_on_click ()) meta_window_raise (window); - meta_window_maximize (window, META_MAXIMIZE_HORIZONTAL); + meta_window_maximize (window, directions); } 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; - - 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); - } - else - { - if (meta_prefs_get_raise_on_click ()) - meta_window_raise (window); - meta_window_unmaximize (window, META_MAXIMIZE_VERTICAL); + meta_window_unmaximize (window, directions); } }