summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2014-02-22 21:42:05 -0500
committerMatthias Clasen <mclasen@redhat.com>2014-02-22 22:24:20 -0500
commit6dcf6e0f3b06808d1d6a4a928f027657a8742d52 (patch)
tree59b2f799797509f201cd7be0e550963cd87115df
parent162e634f56bc601a3d30b61b76b5a1f0771e3a0f (diff)
downloadgtk+-6dcf6e0f3b06808d1d6a4a928f027657a8742d52.tar.gz
Be more careful to change state atomically
This avoids temporary states of maximized+tiled that we otherwise report.
-rw-r--r--gdk/x11/gdkdisplay-x11.c56
1 files changed, 18 insertions, 38 deletions
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index 0953fcf032..1ba4635847 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -189,7 +189,7 @@ static void
do_net_wm_state_changes (GdkWindow *window)
{
GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (window);
- GdkWindowState old_state;
+ GdkWindowState old_state, set, unset;
if (GDK_WINDOW_DESTROYED (window) ||
gdk_window_get_window_type (window) != GDK_WINDOW_TOPLEVEL)
@@ -197,37 +197,31 @@ do_net_wm_state_changes (GdkWindow *window)
old_state = gdk_window_get_state (window);
+ set = unset = 0;
+
/* For found_sticky to remain TRUE, we have to also be on desktop
* 0xFFFFFFFF
*/
if (old_state & GDK_WINDOW_STATE_STICKY)
{
if (!(toplevel->have_sticky && toplevel->on_all_desktops))
- gdk_synthesize_window_state (window,
- GDK_WINDOW_STATE_STICKY,
- 0);
+ unset |= GDK_WINDOW_STATE_STICKY;
}
else
{
if (toplevel->have_sticky && toplevel->on_all_desktops)
- gdk_synthesize_window_state (window,
- 0,
- GDK_WINDOW_STATE_STICKY);
+ set |= GDK_WINDOW_STATE_STICKY;
}
if (old_state & GDK_WINDOW_STATE_FULLSCREEN)
{
if (!toplevel->have_fullscreen)
- gdk_synthesize_window_state (window,
- GDK_WINDOW_STATE_FULLSCREEN,
- 0);
+ unset |= GDK_WINDOW_STATE_FULLSCREEN;
}
else
{
if (toplevel->have_fullscreen)
- gdk_synthesize_window_state (window,
- 0,
- GDK_WINDOW_STATE_FULLSCREEN);
+ set |= GDK_WINDOW_STATE_FULLSCREEN;
}
/* Our "maximized" means both vertical and horizontal; if only one,
@@ -236,16 +230,12 @@ do_net_wm_state_changes (GdkWindow *window)
if (old_state & GDK_WINDOW_STATE_MAXIMIZED)
{
if (!(toplevel->have_maxvert && toplevel->have_maxhorz))
- gdk_synthesize_window_state (window,
- GDK_WINDOW_STATE_MAXIMIZED,
- 0);
+ unset |= GDK_WINDOW_STATE_MAXIMIZED;
}
else
{
if (toplevel->have_maxvert && toplevel->have_maxhorz)
- gdk_synthesize_window_state (window,
- 0,
- GDK_WINDOW_STATE_MAXIMIZED);
+ set |= GDK_WINDOW_STATE_MAXIMIZED;
}
/* FIXME: we rely on implementation details of mutter here:
@@ -255,47 +245,37 @@ do_net_wm_state_changes (GdkWindow *window)
if (old_state & GDK_WINDOW_STATE_TILED)
{
if (!toplevel->have_maxvert)
- gdk_synthesize_window_state (window,
- GDK_WINDOW_STATE_TILED,
- 0);
+ unset |= GDK_WINDOW_STATE_TILED;
}
else
{
- if (toplevel->have_maxvert)
- gdk_synthesize_window_state (window,
- 0,
- GDK_WINDOW_STATE_TILED);
+ if (toplevel->have_maxvert && !toplevel->have_maxhorz)
+ set |= GDK_WINDOW_STATE_TILED;
}
if (old_state & GDK_WINDOW_STATE_FOCUSED)
{
if (!toplevel->have_focused)
- gdk_synthesize_window_state (window,
- GDK_WINDOW_STATE_FOCUSED,
- 0);
+ unset |= GDK_WINDOW_STATE_FOCUSED;
}
else
{
if (toplevel->have_focused)
- gdk_synthesize_window_state (window,
- 0,
- GDK_WINDOW_STATE_FOCUSED);
+ set |= GDK_WINDOW_STATE_FOCUSED;
}
if (old_state & GDK_WINDOW_STATE_ICONIFIED)
{
if (!toplevel->have_hidden)
- gdk_synthesize_window_state (window,
- GDK_WINDOW_STATE_ICONIFIED,
- 0);
+ unset |= GDK_WINDOW_STATE_ICONIFIED;
}
else
{
if (toplevel->have_hidden)
- gdk_synthesize_window_state (window,
- 0,
- GDK_WINDOW_STATE_ICONIFIED);
+ set |= GDK_WINDOW_STATE_ICONIFIED;
}
+
+ gdk_synthesize_window_state (window, unset, set);
}
static void