diff options
author | Matthias Clasen <matthiasc@src.gnome.org> | 2009-01-04 04:48:40 +0000 |
---|---|---|
committer | Matthias Clasen <matthiasc@src.gnome.org> | 2009-01-04 04:48:40 +0000 |
commit | 1b393f5fa0951982eec38e1c1e18590821afe13d (patch) | |
tree | c856a33e17c6c1815147d2bc295d21ba45dc6908 | |
parent | d019b714ca88580377110b36acf9251ea9cc7e58 (diff) | |
download | gdk-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-- | ChangeLog | 8 | ||||
-rw-r--r-- | gdk/x11/gdkevents-x11.c | 25 | ||||
-rw-r--r-- | gdk/x11/gdkscreen-x11.h | 1 |
3 files changed, 23 insertions, 11 deletions
@@ -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 |