comparison pidgin/gtkmedia.c @ 26053:99c3489e06b0

Wait for local video frame to be realized before starting local video. This fixes half of the BadWindow errors that have plagued vv.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Sun, 14 Dec 2008 23:43:52 +0000
parents 6260a6192166
children 0ad1b8e950d7
comparison
equal deleted inserted replaced
26052:01df0829f054 26053:99c3489e06b0
298 g_free(name); 298 g_free(name);
299 return TRUE; 299 return TRUE;
300 } 300 }
301 301
302 static void 302 static void
303 realize_cb(GtkWidget *widget, GstElement *element)
304 {
305 gst_element_set_state(element, GST_STATE_PLAYING);
306 }
307
308 static void
303 pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia) 309 pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia)
304 { 310 {
305 GstElement *pipeline = purple_media_get_pipeline(media); 311 GstElement *pipeline = purple_media_get_pipeline(media);
306 GtkWidget *send_widget = NULL, *recv_widget = NULL; 312 GtkWidget *send_widget = NULL, *recv_widget = NULL;
307 GstElement *audiosendbin = NULL, *audiosendlevel = NULL; 313 GstElement *audiosendbin = NULL, *audiosendlevel = NULL;
325 } 331 }
326 } else if (type & PURPLE_MEDIA_VIDEO) { 332 } else if (type & PURPLE_MEDIA_VIDEO) {
327 if (!videosendbin && (type & PURPLE_MEDIA_SEND_VIDEO)) { 333 if (!videosendbin && (type & PURPLE_MEDIA_SEND_VIDEO)) {
328 purple_media_video_init_src(&videosendbin); 334 purple_media_video_init_src(&videosendbin);
329 purple_media_set_src(media, sessions->data, videosendbin); 335 purple_media_set_src(media, sessions->data, videosendbin);
330 gst_element_set_state(videosendbin, GST_STATE_PLAYING);
331 } 336 }
332 if (!videorecvbool && (type & PURPLE_MEDIA_RECV_VIDEO)) { 337 if (!videorecvbool && (type & PURPLE_MEDIA_RECV_VIDEO)) {
333 videorecvbool = TRUE; 338 videorecvbool = TRUE;
334 } 339 }
335 } 340 }
371 aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE); 376 aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE);
372 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN); 377 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN);
373 gtk_box_pack_start(GTK_BOX(send_widget), aspect, TRUE, TRUE, 0); 378 gtk_box_pack_start(GTK_BOX(send_widget), aspect, TRUE, TRUE, 0);
374 379
375 local_video = gtk_drawing_area_new(); 380 local_video = gtk_drawing_area_new();
381 g_signal_connect(G_OBJECT(local_video), "realize",
382 G_CALLBACK(realize_cb), videosendbin);
383
376 gtk_container_add(GTK_CONTAINER(aspect), local_video); 384 gtk_container_add(GTK_CONTAINER(aspect), local_video);
377 gtk_widget_set_size_request (GTK_WIDGET(local_video), 100, -1); 385 gtk_widget_set_size_request (GTK_WIDGET(local_video), 100, -1);
386
378 gtk_widget_show(local_video); 387 gtk_widget_show(local_video);
379 gtk_widget_show(aspect); 388 gtk_widget_show(aspect);
380 389
381 gtkmedia->priv->local_video = local_video; 390 gtkmedia->priv->local_video = local_video;
382 } 391 }
403 } 412 }
404 413
405 bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); 414 bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
406 415
407 if (videorecvbool || videosendbin) 416 if (videorecvbool || videosendbin)
408 gst_bus_set_sync_handler(bus, 417 g_signal_connect(bus, "sync-message::element",
409 (GstBusSyncHandler)create_window, gtkmedia); 418 G_CALLBACK(create_window), gtkmedia);
410 419
411 if (audiorecvbool || audiosendbin) 420 if (audiorecvbool || audiosendbin)
412 g_signal_connect(G_OBJECT(bus), "message::element", 421 g_signal_connect(G_OBJECT(bus), "message::element",
413 G_CALLBACK(level_message_cb), gtkmedia); 422 G_CALLBACK(level_message_cb), gtkmedia);
414 423