Mercurial > pidgin.yaz
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 |