]> git.0d.be Git - empathy.git/commitdiff
[EmpathyVideoWidget] fix X crash when using Empathy with GTK+ c-s-w
authorDanielle Madeley <danielle.madeley@collabora.co.uk>
Mon, 14 Sep 2009 01:33:06 +0000 (11:33 +1000)
committerSjoerd Simons <sjoerd.simons@collabora.co.uk>
Mon, 14 Sep 2009 08:27:12 +0000 (09:27 +0100)
In client-side-windows enabled GTK+, a call to GDK_WINDOW_XID() implicitly calls
gdk_window_ensure_native() so that a native X11 window exists serverside to
have an XID for.

Calling gdk_window_ensure_native() from a thread is not awesome and causes
Empathy to abort with one of several X errors. The fix is to call
GDK_WINDOW_XID() as soon as the widget is realized, before the XID is requested
from a thread (it would be neater to call gdk_window_ensure_native() here,
but that would force us to require GTK+ 2.18, which we don't want to do).

Fixes gnome bug #594890

libempathy-gtk/empathy-video-widget.c

index 0f62496decc915c2b6ceab0847834570ea3a6457..915aa33da037c6d451fb99e86d5393061e2303b3 100644 (file)
@@ -99,6 +99,16 @@ empathy_video_widget_init (EmpathyVideoWidget *obj)
   GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (obj), GTK_DOUBLE_BUFFERED);
 }
 
+static void
+empathy_video_widget_realized (GtkWidget *widget, gpointer user_data)
+{
+  /* requesting the XID forces the GdkWindow to be native in GTK+ 2.18
+   * onwards, requesting the native window in a thread causes a BadWindowID,
+   * so we need to request it now. We could call gdk_window_ensure_native(),
+   * but that would mean we require GTK+ 2.18, so instead we call this */
+  GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (widget)));
+}
+
 static void
 empathy_video_widget_constructed (GObject *object)
 {
@@ -106,6 +116,9 @@ empathy_video_widget_constructed (GObject *object)
   GstElement *colorspace, *videoscale, *sink;
   GstPad *pad;
 
+  g_signal_connect (object, "realize",
+      G_CALLBACK (empathy_video_widget_realized), NULL);
+
   priv->videosink = gst_bin_new (NULL);
 
   gst_object_ref (priv->videosink);