diff options
author | Mikael Magnusson <mikachu@gmail.com> | 2012-02-21 17:14:16 +0100 |
---|---|---|
committer | Mikael Magnusson <mikachu@gmail.com> | 2012-03-02 20:36:28 +0100 |
commit | 1c970036648bffd5d58499bb7c8e2439b84d4397 (patch) | |
tree | 65a4e86e32e63a5d60c5abe156d1f0a08635ae75 /gdk | |
parent | 2e89531eb1c79e95c80354a707b11aa269fd2a33 (diff) | |
download | gtk+-1c970036648bffd5d58499bb7c8e2439b84d4397.tar.gz |
Iconification using _NET_WM_STATE_HIDDEN hint if supported by WM
If the Window Manager supports the _NET_WM_STATE_HIDDEN, we use it to use
the _NET_WM_STATE protocol when de-iconifying windows (iconification is
unchanged, via XIconifyWindow). Additionally, we no longer interpret all
UnmapNotify events for our window as the result of iconification.
(Based on patch by Tomas Frydrych <tf@linux.intel.com>)
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/x11/gdkdisplay-x11.c | 49 | ||||
-rw-r--r-- | gdk/x11/gdkwindow-x11.c | 17 | ||||
-rw-r--r-- | gdk/x11/gdkwindow-x11.h | 1 |
3 files changed, 56 insertions, 11 deletions
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index cf29c8e865..1017975672 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -254,6 +254,21 @@ do_net_wm_state_changes (GdkWindow *window) 0, 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); + } + else + { + if (toplevel->have_hidden) + gdk_synthesize_window_state (window, + 0, + GDK_WINDOW_STATE_ICONIFIED); + } } static void @@ -313,6 +328,7 @@ gdk_check_wm_state_changed (GdkWindow *window) toplevel->have_maxhorz = FALSE; toplevel->have_fullscreen = FALSE; toplevel->have_focused = FALSE; + toplevel->have_hidden = FALSE; type = None; gdk_x11_display_error_trap_push (display); @@ -329,6 +345,7 @@ gdk_check_wm_state_changed (GdkWindow *window) Atom maxhorz_atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_MAXIMIZED_HORZ"); Atom fullscreen_atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_FULLSCREEN"); Atom focused_atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_FOCUSED"); + Atom hidden_atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_HIDDEN"); atoms = (Atom *)data; @@ -345,6 +362,8 @@ gdk_check_wm_state_changed (GdkWindow *window) toplevel->have_fullscreen = TRUE; else if (atoms[i] == focused_atom) toplevel->have_focused = TRUE; + else if (atoms[i] == hidden_atom) + toplevel->have_hidden = TRUE; ++i; } @@ -629,19 +648,27 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator, event->any.type = GDK_UNMAP; event->any.window = window; - /* If we are shown (not withdrawn) and get an unmap, it means we - * were iconified in the X sense. If we are withdrawn, and get - * an unmap, it means we hid the window ourselves, so we - * will have already flipped the iconified bit off. + /* If the WM supports the _NET_WM_STATE_HIDDEN hint, we do not want to + * interpret UnmapNotify events as implying iconic state. + * http://bugzilla.gnome.org/show_bug.cgi?id=590726. */ - if (window) + if (screen && + !gdk_x11_screen_supports_net_wm_hint (screen, + gdk_atom_intern_static_string ("_NET_WM_STATE_HIDDEN"))) { - if (GDK_WINDOW_IS_MAPPED (window)) - gdk_synthesize_window_state (window, - 0, - GDK_WINDOW_STATE_ICONIFIED); - - _gdk_x11_window_grab_check_unmap (window, xevent->xany.serial); + /* If we are shown (not withdrawn) and get an unmap, it means we were + * iconified in the X sense. If we are withdrawn, and get an unmap, it + * means we hid the window ourselves, so we will have already flipped + * the iconified bit off. + */ + if (window) + { + if (GDK_WINDOW_IS_MAPPED (window)) + gdk_synthesize_window_state (window, + 0, + GDK_WINDOW_STATE_ICONIFIED); + _gdk_x11_window_grab_check_unmap (window, xevent->xany.serial); + } } break; diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index a1c3f97d2a..0a72921080 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -1270,6 +1270,14 @@ set_initial_hints (GdkWindow *window) ++i; } + if (window->state & GDK_WINDOW_STATE_ICONIFIED) + { + atoms[i] = gdk_x11_get_xatom_by_name_for_display (display, + "_NET_WM_STATE_HIDDEN"); + ++i; + toplevel->have_hidden = TRUE; + } + if (i > 0) { XChangeProperty (xdisplay, @@ -3468,6 +3476,9 @@ gdk_x11_window_iconify (GdkWindow *window) gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_ICONIFIED); + gdk_wmspec_change_state (TRUE, window, + gdk_atom_intern_static_string ("_NET_WM_STATE_HIDDEN"), + GDK_NONE); } } @@ -3481,6 +3492,9 @@ gdk_x11_window_deiconify (GdkWindow *window) if (GDK_WINDOW_IS_MAPPED (window)) { gdk_window_show (window); + gdk_wmspec_change_state (FALSE, window, + gdk_atom_intern_static_string ("_NET_WM_STATE_HIDDEN"), + GDK_NONE); } else { @@ -3488,6 +3502,9 @@ gdk_x11_window_deiconify (GdkWindow *window) gdk_synthesize_window_state (window, GDK_WINDOW_STATE_ICONIFIED, 0); + gdk_wmspec_change_state (FALSE, window, + gdk_atom_intern_static_string ("_NET_WM_STATE_HIDDEN"), + GDK_NONE); } } diff --git a/gdk/x11/gdkwindow-x11.h b/gdk/x11/gdkwindow-x11.h index 53a5c1a159..3dde77767d 100644 --- a/gdk/x11/gdkwindow-x11.h +++ b/gdk/x11/gdkwindow-x11.h @@ -119,6 +119,7 @@ struct _GdkToplevelX11 guint have_maxvert : 1; /* _NET_WM_STATE_MAXIMIZED_VERT */ guint have_maxhorz : 1; /* _NET_WM_STATE_MAXIMIZED_HORZ */ guint have_fullscreen : 1; /* _NET_WM_STATE_FULLSCREEN */ + guint have_hidden : 1; /* _NET_WM_STATE_HIDDEN */ guint is_leader : 1; |