[gtk+] Make window manager tracking work better
- From: Matthias Clasen <matthiasc src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gtk+] Make window manager tracking work better
- Date: Sat, 5 Sep 2009 00:25:48 +0000 (UTC)
commit 5c14089225e5706af90e0c195d2e95886bef6418
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Sep 4 20:22:43 2009 -0400
Make window manager tracking work better
We were getting the new wm name with a 15 second delay, due to
some race. Reported in bug 593644.
gdk/x11/gdkevents-x11.c | 64 +++++++++++++++++++++++++++-------------------
1 files changed, 37 insertions(+), 27 deletions(-)
---
diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c
index 0b74841..67c0a76 100644
--- a/gdk/x11/gdkevents-x11.c
+++ b/gdk/x11/gdkevents-x11.c
@@ -1032,28 +1032,31 @@ gdk_event_translate (GdkDisplay *display,
}
}
}
-
- if (screen_x11 && screen_x11->wmspec_check_window != None &&
- xwindow == screen_x11->wmspec_check_window)
+
+ if (xevent->type == DestroyNotify)
{
- if (xevent->type == DestroyNotify)
+ int i, n;
+
+ n = gdk_display_get_n_screens (display);
+ for (i = 0; i < n; i++)
{
- screen_x11->wmspec_check_window = None;
- g_free (screen_x11->window_manager_name);
- screen_x11->window_manager_name = g_strdup ("unknown");
+ screen = gdk_display_get_screen (display, i);
+ screen_x11 = GDK_SCREEN_X11 (screen);
+
+ if (screen_x11->wmspec_check_window == xwindow)
+ {
+ screen_x11->wmspec_check_window = None;
+ screen_x11->last_wmspec_check_time = 0;
+ g_free (screen_x11->window_manager_name);
+ screen_x11->window_manager_name = g_strdup ("unknown");
- /* careful, reentrancy */
- _gdk_x11_screen_window_manager_changed (GDK_SCREEN (screen_x11));
+ /* careful, reentrancy */
+ _gdk_x11_screen_window_manager_changed (screen);
+
+ retval = FALSE;
+ goto done;
+ }
}
-
- /* Eat events on this window unless someone had wrapped
- * it as a foreign window
- */
- if (window == NULL)
- {
- return_val = FALSE;
- goto done;
- }
}
if (window &&
@@ -2629,23 +2632,24 @@ fetch_net_wm_check_window (GdkScreen *screen)
guchar *data;
Window *xwindow;
GTimeVal tv;
-
+ gint error;
+
screen_x11 = GDK_SCREEN_X11 (screen);
display = screen_x11->display;
g_return_if_fail (GDK_DISPLAY_X11 (display)->trusted_client);
g_get_current_time (&tv);
-
+
if (ABS (tv.tv_sec - screen_x11->last_wmspec_check_time) < 15)
return; /* we've checked recently */
screen_x11->last_wmspec_check_time = tv.tv_sec;
data = NULL;
- XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), screen_x11->xroot_window,
+ XGetWindowProperty (screen_x11->xdisplay, screen_x11->xroot_window,
gdk_x11_get_xatom_by_name_for_display (display, "_NET_SUPPORTING_WM_CHECK"),
- 0, G_MAXLONG, False, XA_WINDOW, &type, &format,
+ 0, G_MAXLONG, False, XA_WINDOW, &type, &format,
&n_items, &bytes_after, &data);
if (type != XA_WINDOW)
@@ -2664,22 +2668,28 @@ fetch_net_wm_check_window (GdkScreen *screen)
}
gdk_error_trap_push ();
-
+
/* Find out if this WM goes away, so we can reset everything. */
XSelectInput (screen_x11->xdisplay, *xwindow, StructureNotifyMask);
gdk_display_sync (display);
- if (gdk_error_trap_pop () == Success)
+ error = gdk_error_trap_pop ();
+ if (!error)
{
screen_x11->wmspec_check_window = *xwindow;
screen_x11->need_refetch_net_supported = TRUE;
screen_x11->need_refetch_wm_name = TRUE;
-
+
/* Careful, reentrancy */
_gdk_x11_screen_window_manager_changed (GDK_SCREEN (screen_x11));
}
+ else if (error == BadWindow)
+ {
+ /* Leftover property, try again immediately, new wm may be starting up */
+ screen_x11->last_wmspec_check_time = 0;
+ }
- XFree (xwindow);
+ XFree (xwindow);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]