]> git.0d.be Git - empathy.git/commitdiff
Fix X display connection leak
authorSjoerd Simons <sjoerd.simons@collabora.co.uk>
Sat, 24 Apr 2010 15:13:50 +0000 (16:13 +0100)
committerSjoerd Simons <sjoerd.simons@collabora.co.uk>
Sat, 24 Apr 2010 15:15:38 +0000 (16:15 +0100)
Use gdk_x11_get_server_time instead our own function for getting the
X server time. This also fixes a leak of one X connection each time
empathy_window_present is used without a timestamp.

libempathy-gtk/empathy-ui-utils.c

index 24f22166b320cdd0a2905eda17732d7b4f4e6a83..3f37ea2db973d7672e8ac85f35308613fb4c7043 100644 (file)
@@ -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);