comparison pidgin/gtkmedia.c @ 26089:6c8eabbef4d3

Fix crash when moving a tab with video.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Thu, 08 Jan 2009 00:24:11 +0000
parents 83704757fa36
children 4859b0b82289
comparison
equal deleted inserted replaced
26088:d703474d6b81 26089:6c8eabbef4d3
360 pidgin_media_error_cb(PidginMedia *media, const char *error, PidginMedia *gtkmedia) 360 pidgin_media_error_cb(PidginMedia *media, const char *error, PidginMedia *gtkmedia)
361 { 361 {
362 g_signal_emit(gtkmedia, pidgin_media_signals[ERROR], 0, error); 362 g_signal_emit(gtkmedia, pidgin_media_signals[ERROR], 0, error);
363 } 363 }
364 364
365 static gboolean
366 plug_delete_event_cb(GtkWidget *widget, gpointer data)
367 {
368 return TRUE;
369 }
370
371 static gboolean
372 plug_removed_cb(GtkWidget *widget, gpointer data)
373 {
374 return TRUE;
375 }
376
377 static void
378 socket_realize_cb(GtkWidget *widget, gpointer data)
379 {
380 gtk_socket_add_id(GTK_SOCKET(widget),
381 gtk_plug_get_id(GTK_PLUG(data)));
382 }
383
365 static void 384 static void
366 pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia) 385 pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia)
367 { 386 {
368 GstElement *pipeline = purple_media_get_pipeline(media); 387 GstElement *pipeline = purple_media_get_pipeline(media);
369 GtkWidget *send_widget = NULL, *recv_widget = NULL; 388 GtkWidget *send_widget = NULL, *recv_widget = NULL;
411 } 430 }
412 431
413 if (videorecvbool) { 432 if (videorecvbool) {
414 GtkWidget *aspect; 433 GtkWidget *aspect;
415 GtkWidget *remote_video; 434 GtkWidget *remote_video;
435 GtkWidget *plug;
436 GtkWidget *socket;
416 437
417 aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE); 438 aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE);
418 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN); 439 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN);
419 gtk_box_pack_start(GTK_BOX(recv_widget), aspect, TRUE, TRUE, 0); 440 gtk_box_pack_start(GTK_BOX(recv_widget), aspect, TRUE, TRUE, 0);
420 441
442 plug = gtk_plug_new(0);
443 g_signal_connect(G_OBJECT(plug), "delete-event",
444 G_CALLBACK(plug_delete_event_cb), plug);
445 gtk_widget_show(plug);
446
447 socket = gtk_socket_new();
448 g_signal_connect(G_OBJECT(socket), "realize",
449 G_CALLBACK(socket_realize_cb), plug);
450 g_signal_connect(G_OBJECT(socket), "plug-removed",
451 G_CALLBACK(plug_removed_cb), NULL);
452 gtk_container_add(GTK_CONTAINER(aspect), socket);
453 gtk_widget_show(socket);
454
421 remote_video = gtk_drawing_area_new(); 455 remote_video = gtk_drawing_area_new();
422 gtk_container_add(GTK_CONTAINER(aspect), remote_video); 456 gtk_container_add(GTK_CONTAINER(plug), remote_video);
423 gtk_widget_set_size_request (GTK_WIDGET(remote_video), 100, -1); 457 gtk_widget_set_size_request (GTK_WIDGET(remote_video), 100, -1);
424 gtk_widget_show(remote_video); 458 gtk_widget_show(remote_video);
425 gtk_widget_show(aspect); 459 gtk_widget_show(aspect);
426 460
427 gtkmedia->priv->remote_video = remote_video; 461 gtkmedia->priv->remote_video = remote_video;
428 } 462 }
429 if (videosendbin) { 463 if (videosendbin) {
430 GtkWidget *aspect; 464 GtkWidget *aspect;
431 GtkWidget *local_video; 465 GtkWidget *local_video;
466 GtkWidget *plug;
467 GtkWidget *socket;
432 468
433 aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE); 469 aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE);
434 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN); 470 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN);
435 gtk_box_pack_start(GTK_BOX(send_widget), aspect, TRUE, TRUE, 0); 471 gtk_box_pack_start(GTK_BOX(send_widget), aspect, TRUE, TRUE, 0);
436 472
473 plug = gtk_plug_new(0);
474 g_signal_connect(G_OBJECT(plug), "delete-event",
475 G_CALLBACK(plug_delete_event_cb), plug);
476 gtk_widget_show(plug);
477
478 socket = gtk_socket_new();
479 g_signal_connect(G_OBJECT(socket), "realize",
480 G_CALLBACK(socket_realize_cb), plug);
481 g_signal_connect(G_OBJECT(socket), "plug-removed",
482 G_CALLBACK(plug_removed_cb), NULL);
483 gtk_container_add(GTK_CONTAINER(aspect), socket);
484 gtk_widget_show(socket);
485
437 local_video = gtk_drawing_area_new(); 486 local_video = gtk_drawing_area_new();
438 g_signal_connect(G_OBJECT(local_video), "realize", 487 g_signal_connect(G_OBJECT(local_video), "realize",
439 G_CALLBACK(realize_cb), videosendbin); 488 G_CALLBACK(realize_cb), videosendbin);
440 489 gtk_container_add(GTK_CONTAINER(plug), local_video);
441 gtk_container_add(GTK_CONTAINER(aspect), local_video);
442 gtk_widget_set_size_request (GTK_WIDGET(local_video), 100, -1); 490 gtk_widget_set_size_request (GTK_WIDGET(local_video), 100, -1);
443 491
444 gtk_widget_show(local_video); 492 gtk_widget_show(local_video);
445 gtk_widget_show(aspect); 493 gtk_widget_show(aspect);
446 494