# HG changeset patch # User Mike Ruprecht # Date 1229298232 0 # Node ID 99c3489e06b036126167a8c49dc24029720a4e1c # Parent 01df0829f054d90931e8112b2135ec4fa22919d8 Wait for local video frame to be realized before starting local video. This fixes half of the BadWindow errors that have plagued vv. diff -r 01df0829f054 -r 99c3489e06b0 libpurple/media.c --- a/libpurple/media.c Sat Dec 13 09:11:08 2008 +0000 +++ b/libpurple/media.c Sun Dec 14 23:43:52 2008 +0000 @@ -738,6 +738,7 @@ gst_bus_add_signal_watch(GST_BUS(bus)); g_signal_connect(G_OBJECT(bus), "message", G_CALLBACK(media_bus_call), media); + gst_bus_set_sync_handler(bus, gst_bus_sync_signal_handler, NULL); gst_object_unref(bus); gst_bin_add(GST_BIN(media->priv->pipeline), GST_ELEMENT(media->priv->conference)); diff -r 01df0829f054 -r 99c3489e06b0 pidgin/gtkmedia.c --- a/pidgin/gtkmedia.c Sat Dec 13 09:11:08 2008 +0000 +++ b/pidgin/gtkmedia.c Sun Dec 14 23:43:52 2008 +0000 @@ -300,6 +300,12 @@ } static void +realize_cb(GtkWidget *widget, GstElement *element) +{ + gst_element_set_state(element, GST_STATE_PLAYING); +} + +static void pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia) { GstElement *pipeline = purple_media_get_pipeline(media); @@ -327,7 +333,6 @@ if (!videosendbin && (type & PURPLE_MEDIA_SEND_VIDEO)) { purple_media_video_init_src(&videosendbin); purple_media_set_src(media, sessions->data, videosendbin); - gst_element_set_state(videosendbin, GST_STATE_PLAYING); } if (!videorecvbool && (type & PURPLE_MEDIA_RECV_VIDEO)) { videorecvbool = TRUE; @@ -373,8 +378,12 @@ gtk_box_pack_start(GTK_BOX(send_widget), aspect, TRUE, TRUE, 0); local_video = gtk_drawing_area_new(); + g_signal_connect(G_OBJECT(local_video), "realize", + G_CALLBACK(realize_cb), videosendbin); + gtk_container_add(GTK_CONTAINER(aspect), local_video); gtk_widget_set_size_request (GTK_WIDGET(local_video), 100, -1); + gtk_widget_show(local_video); gtk_widget_show(aspect); @@ -405,8 +414,8 @@ bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); if (videorecvbool || videosendbin) - gst_bus_set_sync_handler(bus, - (GstBusSyncHandler)create_window, gtkmedia); + g_signal_connect(bus, "sync-message::element", + G_CALLBACK(create_window), gtkmedia); if (audiorecvbool || audiosendbin) g_signal_connect(G_OBJECT(bus), "message::element",