summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <matthiasc@src.gnome.org>2009-01-04 04:48:40 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2009-01-04 04:48:40 +0000
commit1b393f5fa0951982eec38e1c1e18590821afe13d (patch)
treec856a33e17c6c1815147d2bc295d21ba45dc6908
parentd019b714ca88580377110b36acf9251ea9cc7e58 (diff)
downloadgdk-pixbuf-1b393f5fa0951982eec38e1c1e18590821afe13d.tar.gz
Recheck _NET_SUPPORTING_WM_CHECK every now and then to avoid getting stuck
* gdk/x11/gdkscreen-x11.h: * gdk/x11/gdkevents-x11.c (fetch_net_wm_check_window): Recheck _NET_SUPPORTING_WM_CHECK every now and then to avoid getting stuck on the id of a former wmcheck window that got reused by another client (see RH bug 471927) svn path=/branches/gtk-2-14/; revision=22057
-rw-r--r--ChangeLog8
-rw-r--r--gdk/x11/gdkevents-x11.c25
-rw-r--r--gdk/x11/gdkscreen-x11.h1
3 files changed, 23 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 995bb2df4..d8aff9d35 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
2009-01-03 Matthias Clasen <mclasen@redhat.com>
+ * gdk/x11/gdkscreen-x11.h:
+ * gdk/x11/gdkevents-x11.c (fetch_net_wm_check_window): Recheck
+ _NET_SUPPORTING_WM_CHECK every now and then to avoid getting
+ stuck on the id of a former wmcheck window that got reused by
+ another client (see RH bug 471927)
+
+2009-01-03 Matthias Clasen <mclasen@redhat.com>
+
* NEWS: Updates
2009-01-03 Matthias Clasen <mclasen@redhat.com>
diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c
index 29efc7e82..cba6ddbec 100644
--- a/gdk/x11/gdkevents-x11.c
+++ b/gdk/x11/gdkevents-x11.c
@@ -2614,23 +2614,20 @@ fetch_net_wm_check_window (GdkScreen *screen)
gulong bytes_after;
guchar *data;
Window *xwindow;
-
- /* This function is very slow on every call if you are not running a
- * spec-supporting WM. For now not optimized, because it isn't in
- * any critical code paths, but if you used it somewhere that had to
- * be fast you want to avoid "GTK is slow with old WMs" complaints.
- * Probably at that point the function should be changed to query
- * _NET_SUPPORTING_WM_CHECK only once every 10 seconds or something.
- */
+ GTimeVal tv;
screen_x11 = GDK_SCREEN_X11 (screen);
display = screen_x11->display;
g_return_if_fail (GDK_DISPLAY_X11 (display)->trusted_client);
- if (screen_x11->wmspec_check_window != None)
- return; /* already have it */
-
+ 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,
gdk_x11_get_xatom_by_name_for_display (display, "_NET_SUPPORTING_WM_CHECK"),
@@ -2646,6 +2643,12 @@ fetch_net_wm_check_window (GdkScreen *screen)
xwindow = (Window *)data;
+ if (screen_x11->wmspec_check_window == *xwindow)
+ {
+ XFree (xwindow);
+ return;
+ }
+
gdk_error_trap_push ();
/* Find out if this WM goes away, so we can reset everything. */
diff --git a/gdk/x11/gdkscreen-x11.h b/gdk/x11/gdkscreen-x11.h
index c5b191095..4ccc795f5 100644
--- a/gdk/x11/gdkscreen-x11.h
+++ b/gdk/x11/gdkscreen-x11.h
@@ -57,6 +57,7 @@ struct _GdkScreenX11
GdkWindow *root_window;
/* Window manager */
+ long last_wmspec_check_time;
Window wmspec_check_window;
char *window_manager_name;
/* TRUE if wmspec_check_window has changed since last