[metacity] avoid confusion when _NET_WM_USER_TIME_WINDOW is in the window stack
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [metacity] avoid confusion when _NET_WM_USER_TIME_WINDOW is in the window stack
- Date: Tue, 28 Feb 2017 01:54:29 +0000 (UTC)
commit 4ff243d36430c954f6bde0134f88cec18f573028
Author: Owen W. Taylor <otaylor fishsoup net>
Date: Thu Sep 16 14:45:53 2010 -0400
avoid confusion when _NET_WM_USER_TIME_WINDOW is in the window stack
Wine sets _NET_WM_USER_TIME_WINDOW to point to an unmapped toplevel;
this was causing much confusion because both the real window and
the unmapped window were in the window stack and mapped back to the
same MetaWindow.
Debugged by Alban Browaeys
https://bugzilla.gnome.org/show_bug.cgi?id=593887
src/core/stack-tracker.c | 20 ++++++++++++++++++--
1 files changed, 18 insertions(+), 2 deletions(-)
---
diff --git a/src/core/stack-tracker.c b/src/core/stack-tracker.c
index 6152184..c6814be 100644
--- a/src/core/stack-tracker.c
+++ b/src/core/stack-tracker.c
@@ -21,6 +21,7 @@
#include <string.h>
+#include "frame-private.h"
#include "meta-compositor.h"
#include "screen-private.h"
#include "stack-tracker.h"
@@ -684,11 +685,26 @@ meta_stack_tracker_sync_stack (MetaStackTracker *tracker)
for (i = 0; i < n_windows; i++)
{
MetaWindow *meta_window;
+ MetaFrame *frame;
meta_window = meta_display_lookup_x_window (tracker->screen->display,
windows[i]);
- if (meta_window)
- meta_windows = g_list_prepend (meta_windows, meta_window);
+
+ if (meta_window == NULL)
+ continue;
+
+ frame = meta_window->frame;
+
+ /* When mapping back from xwindow to MetaWindow we have to be a bit careful;
+ * children of the root could include unmapped windows created by toolkits
+ * for internal purposes, including ones that we have registered in our
+ * XID => window table. (Wine uses a toplevel for _NET_WM_USER_TIME_WINDOW;
+ * see window-prop.c:reload_net_wm_user_time_window() for registration.)
+ */
+ if (windows[i] == meta_window->xwindow || (frame && windows[i] == frame->xwindow))
+ {
+ meta_windows = g_list_prepend (meta_windows, meta_window);
+ }
}
meta_compositor_sync_stack (tracker->screen->display->compositor, meta_windows);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]