From ddcb7848002b70bc8950d45a9079582a8787c394 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Mon, 14 Sep 2009 11:33:06 +1000 Subject: [EmpathyVideoWidget] fix X crash when using Empathy with GTK+ c-s-w 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 | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'libempathy-gtk') diff --git a/libempathy-gtk/empathy-video-widget.c b/libempathy-gtk/empathy-video-widget.c index 0f62496de..915aa33da 100644 --- a/libempathy-gtk/empathy-video-widget.c +++ b/libempathy-gtk/empathy-video-widget.c @@ -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); -- cgit v1.2.3