diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2010-04-26 15:38:09 +0800 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2010-04-26 15:38:09 +0800 |
commit | 46338dc06aaa765efa00b98b497ca4a3dace5b5a (patch) | |
tree | 548dbe2aca8d14dc3506cf936c6741d9537e99af | |
parent | 6cc47b68ab83d4fc6db320313f40b89869444afa (diff) | |
parent | 97dd1e1301eb2c0e2cfc25c4cda6cd9a8bc447d5 (diff) | |
download | gsoc2013-empathy-46338dc06aaa765efa00b98b497ca4a3dace5b5a.tar gsoc2013-empathy-46338dc06aaa765efa00b98b497ca4a3dace5b5a.tar.gz gsoc2013-empathy-46338dc06aaa765efa00b98b497ca4a3dace5b5a.tar.bz2 gsoc2013-empathy-46338dc06aaa765efa00b98b497ca4a3dace5b5a.tar.lz gsoc2013-empathy-46338dc06aaa765efa00b98b497ca4a3dace5b5a.tar.xz gsoc2013-empathy-46338dc06aaa765efa00b98b497ca4a3dace5b5a.tar.zst gsoc2013-empathy-46338dc06aaa765efa00b98b497ca4a3dace5b5a.zip |
Merge remote branch 'sjoerd/dislay-leaks'
-rw-r--r-- | libempathy-gtk/empathy-ui-utils.c | 64 |
1 files changed, 12 insertions, 52 deletions
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c index 24f22166b..3f37ea2db 100644 --- a/libempathy-gtk/empathy-ui-utils.c +++ b/libempathy-gtk/empathy-ui-utils.c @@ -1390,55 +1390,6 @@ empathy_window_iconify (GtkWindow *window, GtkStatusIcon *status_icon) gtk_window_iconify (window); } -/* Code from Thomas Thurman - * http://people.collabora.co.uk/~tthurman/pingwindow.c.txt - */ -static guint32 -get_server_time (void) -{ - Display *display; - Window pingingWindow; - XEvent propertyEvent; - XSetWindowAttributes attrs; - - display = XOpenDisplay (NULL); - - attrs.override_redirect = True; - attrs.event_mask = PropertyChangeMask; - - pingingWindow = XCreateWindow (display, - XRootWindow (display, 0), /* parent */ - -100, -100, 1, 1, /* off-screen */ - 0, - CopyFromParent, - CopyFromParent, - (Visual *) CopyFromParent, - CWOverrideRedirect | CWEventMask, - &attrs); - - /* Change a property. XA_PRIMARY is never really - * used for properties, so it's safe. - */ - XChangeProperty (display, - pingingWindow, - XA_PRIMARY, XA_STRING, 8, - PropModeAppend, NULL, 0); - - /* Pick up the event. */ - XWindowEvent (display, - pingingWindow, - PropertyChangeMask, - &propertyEvent); - - /* If you want to do this often, - * just keep the window around and - * don't destroy it. - */ - XDestroyWindow (display, pingingWindow); - - return ((XPropertyEvent *) &propertyEvent)->time; -} - /* Takes care of moving the window to the current workspace. */ void empathy_window_present (GtkWindow *window) @@ -1467,9 +1418,18 @@ empathy_window_present (GtkWindow *window) } timestamp = gtk_get_current_event_time (); - if (timestamp == 0) - /* No event, fallback to X server time */ - timestamp = get_server_time (); + if (timestamp == 0 && gdk_window != NULL) { + GdkEventMask mask; + + /* According to the documentation of gdk_x11_get_server_time + * GDK_PROPERTY_CHANGE_MASK needs to be set in its events otherwise a hang + * can occur. Be sure to at least temporarily set this mask */ + mask = gdk_window_get_events (gdk_window); + gdk_window_set_events (gdk_window, + mask | GDK_PROPERTY_CHANGE_MASK); + timestamp = gdk_x11_get_server_time (gdk_window); + gdk_window_set_events (gdk_window, mask); + } gtk_window_present_with_time (window, timestamp); gtk_window_set_skip_taskbar_hint (window, FALSE); |