comparison pidgin/gtkmedia.c @ 30909:25e200cb3532

propagate from branch 'im.pidgin.pidgin' (head dca20e09164518b0f7a773edd7e9649f41d8873d) to branch 'im.pidgin.cpw.malu.xmpp.google_refactor' (head 7823c556f2d1bbca43f5ef9f0fea30cabc5d313f)
author Marcus Lundblad <ml@update.uu.se>
date Tue, 31 Aug 2010 18:28:10 +0000
parents b6c3000eec60
children 11211e6427ae
comparison
equal deleted inserted replaced
30908:c44ec533a48c 30909:25e200cb3532
82 { 82 {
83 PurpleMedia *media; 83 PurpleMedia *media;
84 gchar *screenname; 84 gchar *screenname;
85 gulong level_handler_id; 85 gulong level_handler_id;
86 86
87 GtkItemFactory *item_factory; 87 GtkUIManager *ui;
88 GtkWidget *menubar; 88 GtkWidget *menubar;
89 GtkWidget *statusbar; 89 GtkWidget *statusbar;
90 90
91 GtkWidget *hold; 91 GtkWidget *hold;
92 GtkWidget *mute; 92 GtkWidget *mute;
258 return 0; 258 return 0;
259 } 259 }
260 #endif 260 #endif
261 261
262 static void 262 static void
263 menu_hangup(gpointer data, guint action, GtkWidget *item) 263 menu_hangup(GtkAction *action, gpointer data)
264 { 264 {
265 PidginMedia *gtkmedia = PIDGIN_MEDIA(data); 265 PidginMedia *gtkmedia = PIDGIN_MEDIA(data);
266 purple_media_stream_info(gtkmedia->priv->media, 266 purple_media_stream_info(gtkmedia->priv->media,
267 PURPLE_MEDIA_INFO_HANGUP, NULL, NULL, TRUE); 267 PURPLE_MEDIA_INFO_HANGUP, NULL, NULL, TRUE);
268 } 268 }
269 269
270 static GtkItemFactoryEntry menu_items[] = { 270 static const GtkActionEntry menu_entries[] = {
271 { N_("/_Media"), NULL, NULL, 0, "<Branch>", NULL }, 271 { "MediaMenu", NULL, N_("_Media"), NULL, NULL, NULL },
272 { N_("/Media/_Hangup"), NULL, menu_hangup, 0, "<Item>", NULL }, 272 { "Hangup", NULL, N_("_Hangup"), NULL, NULL, G_CALLBACK(menu_hangup) },
273 }; 273 };
274 274
275 static gint menu_item_count = sizeof(menu_items) / sizeof(menu_items[0]); 275 static const char *media_menu =
276 276 "<ui>"
277 static const char * 277 "<menubar name='Media'>"
278 item_factory_translate_func (const char *path, gpointer func_data) 278 "<menu action='MediaMenu'>"
279 { 279 "<menuitem action='Hangup'/>"
280 return _(path); 280 "</menu>"
281 } 281 "</menubar>"
282 "</ui>";
282 283
283 static GtkWidget * 284 static GtkWidget *
284 setup_menubar(PidginMedia *window) 285 setup_menubar(PidginMedia *window)
285 { 286 {
287 GtkActionGroup *action_group;
288 GError *error;
286 GtkAccelGroup *accel_group; 289 GtkAccelGroup *accel_group;
287 GtkWidget *menu; 290 GtkWidget *menu;
288 291
289 accel_group = gtk_accel_group_new (); 292 action_group = gtk_action_group_new("MediaActions");
293 gtk_action_group_add_actions(action_group,
294 menu_entries,
295 G_N_ELEMENTS(menu_entries),
296 GTK_WINDOW(window));
297 #ifdef ENABLE_NLS
298 gtk_action_group_set_translation_domain(action_group,
299 PACKAGE);
300 #endif
301
302 window->priv->ui = gtk_ui_manager_new();
303 gtk_ui_manager_insert_action_group(window->priv->ui, action_group, 0);
304
305 accel_group = gtk_ui_manager_get_accel_group(window->priv->ui);
290 gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); 306 gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
291 g_object_unref(accel_group); 307
292 308 error = NULL;
293 window->priv->item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, 309 if (!gtk_ui_manager_add_ui_from_string(window->priv->ui, media_menu, -1, &error))
294 "<main>", accel_group); 310 {
295 311 g_message("building menus failed: %s", error->message);
296 gtk_item_factory_set_translate_func(window->priv->item_factory, 312 g_error_free(error);
297 (GtkTranslateFunc)item_factory_translate_func, 313 exit(EXIT_FAILURE);
298 NULL, NULL); 314 }
299 315
300 gtk_item_factory_create_items(window->priv->item_factory, 316 menu = gtk_ui_manager_get_widget(window->priv->ui, "/Media");
301 menu_item_count, menu_items, window);
302 g_signal_connect(G_OBJECT(accel_group), "accel-changed",
303 G_CALLBACK(pidgin_save_accels_cb), NULL);
304
305 menu = gtk_item_factory_get_widget(
306 window->priv->item_factory, "<main>");
307 317
308 gtk_widget_show(menu); 318 gtk_widget_show(menu);
309 return menu; 319 return menu;
310 } 320 }
311 321
331 341
332 media->priv->menubar = setup_menubar(media); 342 media->priv->menubar = setup_menubar(media);
333 gtk_box_pack_start(GTK_BOX(vbox), media->priv->menubar, 343 gtk_box_pack_start(GTK_BOX(vbox), media->priv->menubar,
334 FALSE, TRUE, 0); 344 FALSE, TRUE, 0);
335 345
336 media->priv->display = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 346 media->priv->display = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
337 gtk_container_set_border_width(GTK_CONTAINER(media->priv->display), 347 gtk_container_set_border_width(GTK_CONTAINER(media->priv->display),
338 PIDGIN_HIG_BOX_SPACE); 348 PIDGIN_HIG_BOX_SPACE);
339 gtk_box_pack_start(GTK_BOX(vbox), media->priv->display, 349 gtk_box_pack_start(GTK_BOX(vbox), media->priv->display,
340 TRUE, TRUE, PIDGIN_HIG_BOX_SPACE); 350 TRUE, TRUE, PIDGIN_HIG_BOX_SPACE);
341 gtk_widget_show(vbox); 351 gtk_widget_show(vbox);
382 pidgin_media_disconnect_levels(gtkmedia->priv->media, gtkmedia); 392 pidgin_media_disconnect_levels(gtkmedia->priv->media, gtkmedia);
383 g_object_unref(gtkmedia->priv->media); 393 g_object_unref(gtkmedia->priv->media);
384 gtkmedia->priv->media = NULL; 394 gtkmedia->priv->media = NULL;
385 } 395 }
386 396
387 if (gtkmedia->priv->item_factory) { 397 if (gtkmedia->priv->ui) {
388 g_object_unref(gtkmedia->priv->item_factory); 398 g_object_unref(gtkmedia->priv->ui);
389 gtkmedia->priv->item_factory = NULL; 399 gtkmedia->priv->ui = NULL;
390 } 400 }
391 401
392 G_OBJECT_CLASS(parent_class)->dispose(media); 402 G_OBJECT_CLASS(parent_class)->dispose(media);
393 } 403 }
394 404
627 PURPLE_MEDIA_RECV_AUDIO)) { 637 PURPLE_MEDIA_RECV_AUDIO)) {
628 recv_widget = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 638 recv_widget = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
629 gtk_box_pack_start(GTK_BOX(gtkmedia->priv->display), 639 gtk_box_pack_start(GTK_BOX(gtkmedia->priv->display),
630 recv_widget, TRUE, TRUE, 0); 640 recv_widget, TRUE, TRUE, 0);
631 gtk_widget_show(recv_widget); 641 gtk_widget_show(recv_widget);
632 } else 642 } else {
633 recv_widget = gtkmedia->priv->recv_widget; 643 recv_widget = gtkmedia->priv->recv_widget;
644 }
634 if (gtkmedia->priv->send_widget == NULL 645 if (gtkmedia->priv->send_widget == NULL
635 && type & (PURPLE_MEDIA_SEND_VIDEO | 646 && type & (PURPLE_MEDIA_SEND_VIDEO |
636 PURPLE_MEDIA_SEND_AUDIO)) { 647 PURPLE_MEDIA_SEND_AUDIO)) {
637 send_widget = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 648 send_widget = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
638 gtk_box_pack_start(GTK_BOX(gtkmedia->priv->display), 649 gtk_box_pack_start(GTK_BOX(gtkmedia->priv->display),
639 send_widget, TRUE, TRUE, 0); 650 send_widget, FALSE, TRUE, 0);
640 button_widget = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 651 button_widget = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
641 gtk_box_pack_end(GTK_BOX(send_widget), button_widget, 652 gtk_box_pack_end(GTK_BOX(recv_widget), button_widget,
642 FALSE, FALSE, 0); 653 FALSE, TRUE, 0);
643 gtk_widget_show(GTK_WIDGET(button_widget));
644 gtk_widget_show(send_widget); 654 gtk_widget_show(send_widget);
645 655
646 /* Hold button */ 656 /* Hold button */
647 gtkmedia->priv->hold = 657 gtkmedia->priv->hold =
648 gtk_toggle_button_new_with_mnemonic("_Hold"); 658 gtk_toggle_button_new_with_mnemonic("_Hold");
659 gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->hold,
660 FALSE, FALSE, 0);
661 gtk_widget_show(gtkmedia->priv->hold);
649 g_signal_connect(gtkmedia->priv->hold, "toggled", 662 g_signal_connect(gtkmedia->priv->hold, "toggled",
650 G_CALLBACK(pidgin_media_hold_toggled), 663 G_CALLBACK(pidgin_media_hold_toggled),
651 gtkmedia); 664 gtkmedia);
652 gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->hold,
653 FALSE, FALSE, 0);
654 gtk_widget_show(gtkmedia->priv->hold);
655 } else { 665 } else {
656 send_widget = gtkmedia->priv->send_widget; 666 send_widget = gtkmedia->priv->send_widget;
657 button_widget = gtkmedia->priv->button_widget; 667 button_widget = gtkmedia->priv->button_widget;
658 } 668 }
659 669
661 PidginMediaRealizeData *data; 671 PidginMediaRealizeData *data;
662 GtkWidget *aspect; 672 GtkWidget *aspect;
663 GtkWidget *remote_video; 673 GtkWidget *remote_video;
664 GdkColor color = {0, 0, 0, 0}; 674 GdkColor color = {0, 0, 0, 0};
665 675
666 aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE); 676 aspect = gtk_aspect_frame_new(NULL, 0, 0, 4.0/3.0, FALSE);
667 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN); 677 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN);
668 gtk_box_pack_start(GTK_BOX(recv_widget), aspect, TRUE, TRUE, 0); 678 gtk_box_pack_start(GTK_BOX(recv_widget), aspect, TRUE, TRUE, 0);
669 679
670 data = g_new0(PidginMediaRealizeData, 1); 680 data = g_new0(PidginMediaRealizeData, 1);
671 data->gtkmedia = gtkmedia; 681 data->gtkmedia = gtkmedia;
681 gtk_widget_show(remote_video); 691 gtk_widget_show(remote_video);
682 gtk_widget_show(aspect); 692 gtk_widget_show(aspect);
683 693
684 gtkmedia->priv->remote_video = remote_video; 694 gtkmedia->priv->remote_video = remote_video;
685 } 695 }
696
686 if (type & PURPLE_MEDIA_SEND_VIDEO) { 697 if (type & PURPLE_MEDIA_SEND_VIDEO) {
687 PidginMediaRealizeData *data; 698 PidginMediaRealizeData *data;
688 GtkWidget *aspect; 699 GtkWidget *aspect;
689 GtkWidget *local_video; 700 GtkWidget *local_video;
690 GdkColor color = {0, 0, 0, 0}; 701 GdkColor color = {0, 0, 0, 0};
691 702
692 aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE); 703 aspect = gtk_aspect_frame_new(NULL, 0, 0, 4.0/3.0, TRUE);
693 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN); 704 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN);
694 gtk_box_pack_start(GTK_BOX(send_widget), aspect, TRUE, TRUE, 0); 705 gtk_box_pack_start(GTK_BOX(send_widget), aspect, FALSE, TRUE, 0);
695 706
696 data = g_new0(PidginMediaRealizeData, 1); 707 data = g_new0(PidginMediaRealizeData, 1);
697 data->gtkmedia = gtkmedia; 708 data->gtkmedia = gtkmedia;
698 data->session_id = g_strdup(sid); 709 data->session_id = g_strdup(sid);
699 data->participant = NULL; 710 data->participant = NULL;
701 local_video = gtk_drawing_area_new(); 712 local_video = gtk_drawing_area_new();
702 gtk_widget_modify_bg(local_video, GTK_STATE_NORMAL, &color); 713 gtk_widget_modify_bg(local_video, GTK_STATE_NORMAL, &color);
703 g_signal_connect(G_OBJECT(local_video), "realize", 714 g_signal_connect(G_OBJECT(local_video), "realize",
704 G_CALLBACK(realize_cb), data); 715 G_CALLBACK(realize_cb), data);
705 gtk_container_add(GTK_CONTAINER(aspect), local_video); 716 gtk_container_add(GTK_CONTAINER(aspect), local_video);
706 gtk_widget_set_size_request (GTK_WIDGET(local_video), 160, 120); 717 gtk_widget_set_size_request (GTK_WIDGET(local_video), 80, 60);
707 718
708 gtk_widget_show(local_video); 719 gtk_widget_show(local_video);
709 gtk_widget_show(aspect); 720 gtk_widget_show(aspect);
710 721
711 gtkmedia->priv->pause = 722 gtkmedia->priv->pause =
712 gtk_toggle_button_new_with_mnemonic(_("_Pause")); 723 gtk_toggle_button_new_with_mnemonic(_("_Pause"));
724 gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->pause,
725 FALSE, FALSE, 0);
726 gtk_widget_show(gtkmedia->priv->pause);
713 g_signal_connect(gtkmedia->priv->pause, "toggled", 727 g_signal_connect(gtkmedia->priv->pause, "toggled",
714 G_CALLBACK(pidgin_media_pause_toggled), 728 G_CALLBACK(pidgin_media_pause_toggled),
715 gtkmedia); 729 gtkmedia);
716 gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->pause,
717 FALSE, FALSE, 0);
718 gtk_widget_show(gtkmedia->priv->pause);
719 730
720 gtkmedia->priv->local_video = local_video; 731 gtkmedia->priv->local_video = local_video;
721 } 732 }
722
723 if (type & PURPLE_MEDIA_RECV_AUDIO) { 733 if (type & PURPLE_MEDIA_RECV_AUDIO) {
724 gtk_box_pack_end(GTK_BOX(recv_widget), 734 gtk_box_pack_end(GTK_BOX(recv_widget),
725 pidgin_media_add_audio_widget(gtkmedia, 735 pidgin_media_add_audio_widget(gtkmedia,
726 PURPLE_MEDIA_RECV_AUDIO), FALSE, FALSE, 0); 736 PURPLE_MEDIA_RECV_AUDIO), FALSE, FALSE, 0);
727 } 737 }
738
728 if (type & PURPLE_MEDIA_SEND_AUDIO) { 739 if (type & PURPLE_MEDIA_SEND_AUDIO) {
729 gtkmedia->priv->mute = 740 gtkmedia->priv->mute =
730 gtk_toggle_button_new_with_mnemonic("_Mute"); 741 gtk_toggle_button_new_with_mnemonic("_Mute");
742 gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->mute,
743 FALSE, FALSE, 0);
744 gtk_widget_show(gtkmedia->priv->mute);
731 g_signal_connect(gtkmedia->priv->mute, "toggled", 745 g_signal_connect(gtkmedia->priv->mute, "toggled",
732 G_CALLBACK(pidgin_media_mute_toggled), 746 G_CALLBACK(pidgin_media_mute_toggled),
733 gtkmedia); 747 gtkmedia);
734 gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->mute, 748
735 FALSE, FALSE, 0); 749 gtk_box_pack_end(GTK_BOX(recv_widget),
736 gtk_widget_show(gtkmedia->priv->mute);
737
738 gtk_box_pack_end(GTK_BOX(send_widget),
739 pidgin_media_add_audio_widget(gtkmedia, 750 pidgin_media_add_audio_widget(gtkmedia,
740 PURPLE_MEDIA_SEND_AUDIO), FALSE, FALSE, 0); 751 PURPLE_MEDIA_SEND_AUDIO), FALSE, FALSE, 0);
741 } 752 }
742
743 753
744 if (type & PURPLE_MEDIA_AUDIO && 754 if (type & PURPLE_MEDIA_AUDIO &&
745 gtkmedia->priv->level_handler_id == 0) { 755 gtkmedia->priv->level_handler_id == 0) {
746 gtkmedia->priv->level_handler_id = g_signal_connect( 756 gtkmedia->priv->level_handler_id = g_signal_connect(
747 media, "level", G_CALLBACK(level_message_cb), 757 media, "level", G_CALLBACK(level_message_cb),
750 760
751 if (send_widget != NULL) 761 if (send_widget != NULL)
752 gtkmedia->priv->send_widget = send_widget; 762 gtkmedia->priv->send_widget = send_widget;
753 if (recv_widget != NULL) 763 if (recv_widget != NULL)
754 gtkmedia->priv->recv_widget = recv_widget; 764 gtkmedia->priv->recv_widget = recv_widget;
755 if (button_widget != NULL) 765 if (button_widget != NULL) {
756 gtkmedia->priv->button_widget = button_widget; 766 gtkmedia->priv->button_widget = button_widget;
767 gtk_widget_show(GTK_WIDGET(button_widget));
768 }
757 769
758 if (purple_media_is_initiator(media, sid, NULL) == FALSE) { 770 if (purple_media_is_initiator(media, sid, NULL) == FALSE) {
759 if (gtkmedia->priv->timeout_id != 0) 771 if (gtkmedia->priv->timeout_id != 0)
760 g_source_remove(gtkmedia->priv->timeout_id); 772 g_source_remove(gtkmedia->priv->timeout_id);
761 gtkmedia->priv->request_type |= type; 773 gtkmedia->priv->request_type |= type;