pidgin/gtkconv.c

branch
vv
changeset 23707
480f94157418
parent 23333
5e25cbf555c0
parent 23696
1049b744d8c8
child 23709
5cbc290a25d2
equal deleted inserted replaced
23363:bd5f7f61d934 23707:480f94157418
44 #include "cmds.h" 44 #include "cmds.h"
45 #include "debug.h" 45 #include "debug.h"
46 #include "idle.h" 46 #include "idle.h"
47 #include "imgstore.h" 47 #include "imgstore.h"
48 #include "log.h" 48 #include "log.h"
49 #include "mediamanager.h"
49 #include "notify.h" 50 #include "notify.h"
50 #include "prpl.h" 51 #include "prpl.h"
51 #include "request.h" 52 #include "request.h"
52 #include "util.h" 53 #include "util.h"
53 #include "version.h" 54 #include "version.h"
58 #include "gtkconvwin.h" 59 #include "gtkconvwin.h"
59 #include "gtkdialogs.h" 60 #include "gtkdialogs.h"
60 #include "gtkimhtml.h" 61 #include "gtkimhtml.h"
61 #include "gtkimhtmltoolbar.h" 62 #include "gtkimhtmltoolbar.h"
62 #include "gtklog.h" 63 #include "gtklog.h"
64 #include "gtkmedia.h"
63 #include "gtkmenutray.h" 65 #include "gtkmenutray.h"
64 #include "gtkpounce.h" 66 #include "gtkpounce.h"
65 #include "gtkprefs.h" 67 #include "gtkprefs.h"
66 #include "gtkprivacy.h" 68 #include "gtkprivacy.h"
67 #include "gtkthemes.h" 69 #include "gtkthemes.h"
1192 1194
1193 gtk_widget_show_all(gtkwin->dialogs.search); 1195 gtk_widget_show_all(gtkwin->dialogs.search);
1194 gtk_widget_grab_focus(s->entry); 1196 gtk_widget_grab_focus(s->entry);
1195 } 1197 }
1196 1198
1199 #ifdef USE_FARSIGHT
1200 /* Forward declare this here, because I want to keep VV-related stuff together
1201 for now */
1202 static void
1203 menu_initiate_voice_call_cb(gpointer data, guint action, GtkWidget *widget);
1204
1205 #endif
1206
1197 static void 1207 static void
1198 menu_send_file_cb(gpointer data, guint action, GtkWidget *widget) 1208 menu_send_file_cb(gpointer data, guint action, GtkWidget *widget)
1199 { 1209 {
1200 PidginWindow *win = data; 1210 PidginWindow *win = data;
1201 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); 1211 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
3051 "<StockItem>", GTK_STOCK_SAVE_AS }, 3061 "<StockItem>", GTK_STOCK_SAVE_AS },
3052 { N_("/Conversation/Clea_r Scrollback"), "<CTL>L", menu_clear_cb, 0, "<StockItem>", GTK_STOCK_CLEAR }, 3062 { N_("/Conversation/Clea_r Scrollback"), "<CTL>L", menu_clear_cb, 0, "<StockItem>", GTK_STOCK_CLEAR },
3053 3063
3054 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>", NULL }, 3064 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>", NULL },
3055 3065
3066 #ifdef USE_FARSIGHT
3067 { N_("/Conversation/_Voice Call..."), NULL, menu_initiate_voice_call_cb, 0,
3068 "<StockItem>", PIDGIN_STOCK_TOOLBAR_CALL},
3069 #endif
3070
3056 { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_SEND_FILE }, 3071 { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_SEND_FILE },
3057 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb, 3072 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb,
3058 0, "<Item>", NULL }, 3073 0, "<Item>", NULL },
3059 { N_("/Conversation/_Get Info"), "<CTL>O", menu_get_info_cb, 0, 3074 { N_("/Conversation/_Get Info"), "<CTL>O", menu_get_info_cb, 0,
3060 "<StockItem>", PIDGIN_STOCK_TOOLBAR_USER_INFO }, 3075 "<StockItem>", PIDGIN_STOCK_TOOLBAR_USER_INFO },
3360 3375
3361 win->menu.view_log = 3376 win->menu.view_log =
3362 gtk_item_factory_get_widget(win->menu.item_factory, 3377 gtk_item_factory_get_widget(win->menu.item_factory,
3363 N_("/Conversation/View Log")); 3378 N_("/Conversation/View Log"));
3364 3379
3380 #ifdef USE_FARSIGHT
3381 win->menu.call =
3382 gtk_item_factory_get_widget(win->menu.item_factory,
3383 N_("/Conversation/Voice Call..."));
3384 #endif
3385
3365 /* --- */ 3386 /* --- */
3366 3387
3367 win->menu.send_file = 3388 win->menu.send_file =
3368 gtk_item_factory_get_widget(win->menu.item_factory, 3389 gtk_item_factory_get_widget(win->menu.item_factory,
3369 N_("/Conversation/Send File...")); 3390 N_("/Conversation/Send File..."));
4714 gboolean chat = (conv->type == PURPLE_CONV_TYPE_CHAT); 4735 gboolean chat = (conv->type == PURPLE_CONV_TYPE_CHAT);
4715 GtkPolicyType imhtml_sw_hscroll; 4736 GtkPolicyType imhtml_sw_hscroll;
4716 int buddyicon_size = 0; 4737 int buddyicon_size = 0;
4717 4738
4718 /* Setup the top part of the pane */ 4739 /* Setup the top part of the pane */
4719 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 4740 gtkconv->topvbox = vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4720 gtk_widget_show(vbox); 4741 gtk_widget_show(vbox);
4721 4742
4722 /* Setup the info pane */ 4743 /* Setup the info pane */
4723 event_box = gtk_event_box_new(); 4744 event_box = gtk_event_box_new();
4724 #if GTK_CHECK_VERSION(2,4,0) 4745 #if GTK_CHECK_VERSION(2,4,0)
6319 if (conv->features & PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY) 6340 if (conv->features & PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY)
6320 buttons |= GTK_IMHTML_CUSTOM_SMILEY; 6341 buttons |= GTK_IMHTML_CUSTOM_SMILEY;
6321 else 6342 else
6322 buttons &= ~GTK_IMHTML_CUSTOM_SMILEY; 6343 buttons &= ~GTK_IMHTML_CUSTOM_SMILEY;
6323 6344
6345 #ifdef USE_FARSIGHT
6346 /* check if account support voice calls, and if the current buddy
6347 supports it */
6348 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
6349 if (serv_can_do_media(gc, purple_conversation_get_name(conv),
6350 PURPLE_MEDIA_RECV_AUDIO & PURPLE_MEDIA_SEND_AUDIO)) {
6351 buttons |= GTK_IMHTML_CALL;
6352 gtk_widget_set_sensitive(win->menu.call, TRUE);
6353 } else {
6354 buttons &= ~GTK_IMHTML_CALL;
6355 gtk_widget_set_sensitive(win->menu.call, FALSE);
6356 }
6357 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {
6358 /* for now, don't care about chats... */
6359 buttons &= ~GTK_IMHTML_CALL;
6360 gtk_widget_set_sensitive(win->menu.call, FALSE);
6361 } else {
6362 buttons &= ~GTK_IMHTML_CALL;
6363 gtk_widget_set_sensitive(win->menu.call, FALSE);
6364 }
6365 #endif
6366
6324 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons); 6367 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons);
6325 if (account != NULL) 6368 if (account != NULL)
6326 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account)); 6369 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account));
6327 6370
6328 /* Deal with menu items */ 6371 /* Deal with menu items */
6853 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event); 6896 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event);
6854 #if GTK_CHECK_VERSION(2,4,0) 6897 #if GTK_CHECK_VERSION(2,4,0)
6855 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE); 6898 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE);
6856 #endif 6899 #endif
6857 gtk_widget_add_events(event, 6900 gtk_widget_add_events(event,
6858 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); 6901 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK);
6859 g_signal_connect(G_OBJECT(event), "button-press-event", 6902 g_signal_connect(G_OBJECT(event), "button-press-event",
6860 G_CALLBACK(icon_menu), gtkconv); 6903 G_CALLBACK(icon_menu), gtkconv);
6861 6904
6862 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL); 6905 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL);
6863 gtk_widget_show(event); 6906 gtk_widget_show(event);
7586 } 7629 }
7587 7630
7588 return TRUE; 7631 return TRUE;
7589 } 7632 }
7590 7633
7634
7635 #ifdef USE_FARSIGHT
7636
7637 static void
7638 pidgin_gtkmedia_message_cb(PidginMedia *media, const char *msg, PurpleConversation *conv)
7639 {
7640 purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, msg, PURPLE_MESSAGE_SYSTEM, time(NULL));
7641 }
7642
7643 static void
7644 menu_initiate_voice_call_cb(gpointer data, guint action, GtkWidget *widget)
7645 {
7646 PidginWindow *win = (PidginWindow *)data;
7647 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
7648 PurpleConnection *gc = purple_conversation_get_gc(conv);
7649
7650 PurpleMedia *media =
7651 serv_initiate_media(gc,
7652 purple_conversation_get_name(conv),
7653 PURPLE_MEDIA_RECV_AUDIO & PURPLE_MEDIA_SEND_AUDIO);
7654
7655 purple_media_wait(media);
7656 }
7657
7658 static void
7659 pidgin_conv_new_media_cb(PurpleMediaManager *manager, PurpleMedia *media, gpointer nul)
7660 {
7661 GstElement *sendbin, *sendlevel;
7662 GstElement *recvbin, *recvlevel;
7663
7664 GtkWidget *gtkmedia;
7665 PurpleConversation *conv;
7666 PidginConversation *gtkconv;
7667
7668 purple_media_audio_init_src(&sendbin, &sendlevel);
7669 purple_media_audio_init_recv(&recvbin, &recvlevel);
7670
7671 purple_media_set_audio_src(media, sendbin);
7672 purple_media_set_audio_sink(media, recvbin);
7673
7674 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM,
7675 purple_connection_get_account(purple_media_get_connection(media)),
7676 purple_media_get_screenname(media));
7677 gtkconv = PIDGIN_CONVERSATION(conv);
7678 if (gtkconv->gtkmedia)
7679 gtk_widget_destroy(gtkconv->gtkmedia);
7680
7681 gtkmedia = pidgin_media_new(media, sendlevel, recvlevel);
7682 gtk_box_pack_start(GTK_BOX(gtkconv->topvbox), gtkmedia, FALSE, FALSE, 0);
7683 gtk_widget_show(gtkmedia);
7684 g_signal_connect(G_OBJECT(gtkmedia), "message", G_CALLBACK(pidgin_gtkmedia_message_cb), conv);
7685
7686 gtkconv->gtkmedia = gtkmedia;
7687 g_signal_connect(G_OBJECT(gtkmedia), "destroy", G_CALLBACK(gtk_widget_destroyed), &(gtkconv->gtkmedia));
7688 }
7689
7690 #endif
7691
7591 void * 7692 void *
7592 pidgin_conversations_get_handle(void) 7693 pidgin_conversations_get_handle(void)
7593 { 7694 {
7594 static int handle; 7695 static int handle;
7595 7696
7687 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/blist/show_protocol_icons", 7788 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/blist/show_protocol_icons",
7688 show_protocol_icons_pref_cb, NULL); 7789 show_protocol_icons_pref_cb, NULL);
7689 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/hide_new", 7790 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/hide_new",
7690 hide_new_pref_cb, NULL); 7791 hide_new_pref_cb, NULL);
7691 7792
7793 g_signal_connect(G_OBJECT(purple_media_manager_get()), "init-media",
7794 G_CALLBACK(pidgin_conv_new_media_cb), NULL);
7692 7795
7693 7796
7694 /********************************************************************** 7797 /**********************************************************************
7695 * Register signals 7798 * Register signals
7696 **********************************************************************/ 7799 **********************************************************************/

mercurial