| 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 **********************************************************************/ |