comparison pidgin/gtkconv.c @ 26019:4d752d07a126

propagate from branch 'im.pidgin.pidgin' (head 25e27ca0f73c4714d17fcdf83d0e4ce7e63bc55d) to branch 'im.pidgin.maiku.vv' (head b9da65a837c05d63e2515eca9d9e118499672003)
author Mike Ruprecht <maiku@soc.pidgin.im>
date Sat, 27 Sep 2008 04:44:17 +0000
parents ac3db6ba7078 bb99ee66120e
children 8bfa1f01f035
comparison
equal deleted inserted replaced
24125:c3dbdb98a119 26019:4d752d07a126
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_VV
1200 /* Forward declare this here, because I want to keep VV-related stuff together
1201 for now */
1202 static void
1203 menu_initiate_audio_call_cb(gpointer data, guint action, GtkWidget *widget);
1204 static void
1205 menu_initiate_video_call_cb(gpointer data, guint action, GtkWidget *widget);
1206 static void
1207 menu_initiate_audio_video_call_cb(gpointer data, guint action, GtkWidget *widget);
1208
1209 #endif
1210
1197 static void 1211 static void
1198 menu_send_file_cb(gpointer data, guint action, GtkWidget *widget) 1212 menu_send_file_cb(gpointer data, guint action, GtkWidget *widget)
1199 { 1213 {
1200 PidginWindow *win = data; 1214 PidginWindow *win = data;
1201 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); 1215 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
3071 "<StockItem>", GTK_STOCK_SAVE_AS }, 3085 "<StockItem>", GTK_STOCK_SAVE_AS },
3072 { N_("/Conversation/Clea_r Scrollback"), "<CTL>L", menu_clear_cb, 0, "<StockItem>", GTK_STOCK_CLEAR }, 3086 { N_("/Conversation/Clea_r Scrollback"), "<CTL>L", menu_clear_cb, 0, "<StockItem>", GTK_STOCK_CLEAR },
3073 3087
3074 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>", NULL }, 3088 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>", NULL },
3075 3089
3090 #ifdef USE_VV
3091 { N_("/Conversation/M_edia"), NULL, NULL, 0, "<Branch>", NULL },
3092
3093 { N_("/Conversation/Media/_Audio Call"), NULL, menu_initiate_audio_call_cb, 0,
3094 "<StockItem>", PIDGIN_STOCK_TOOLBAR_AUDIO_CALL },
3095 { N_("/Conversation/Media/_Video Call"), NULL, menu_initiate_video_call_cb, 0,
3096 "<StockItem>", PIDGIN_STOCK_TOOLBAR_VIDEO_CALL },
3097 { N_("/Conversation/Media/Audio\\/Video _Call"), NULL, menu_initiate_audio_video_call_cb, 0,
3098 "<StockItem>", PIDGIN_STOCK_TOOLBAR_VIDEO_CALL },
3099 #endif
3100
3076 { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_SEND_FILE }, 3101 { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_SEND_FILE },
3077 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb, 3102 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb,
3078 0, "<Item>", NULL }, 3103 0, "<Item>", NULL },
3079 { N_("/Conversation/_Get Info"), "<CTL>O", menu_get_info_cb, 0, 3104 { N_("/Conversation/_Get Info"), "<CTL>O", menu_get_info_cb, 0,
3080 "<StockItem>", PIDGIN_STOCK_TOOLBAR_USER_INFO }, 3105 "<StockItem>", PIDGIN_STOCK_TOOLBAR_USER_INFO },
3381 3406
3382 win->menu.view_log = 3407 win->menu.view_log =
3383 gtk_item_factory_get_widget(win->menu.item_factory, 3408 gtk_item_factory_get_widget(win->menu.item_factory,
3384 N_("/Conversation/View Log")); 3409 N_("/Conversation/View Log"));
3385 3410
3411 #ifdef USE_VV
3412 win->menu.audio_call =
3413 gtk_item_factory_get_widget(win->menu.item_factory,
3414 N_("/Conversation/Media/Audio Call"));
3415 win->menu.video_call =
3416 gtk_item_factory_get_widget(win->menu.item_factory,
3417 N_("/Conversation/Media/Video Call"));
3418 win->menu.audio_video_call =
3419 gtk_item_factory_get_widget(win->menu.item_factory,
3420 N_("/Conversation/Media/Audio\\/Video Call"));
3421 #endif
3422
3386 /* --- */ 3423 /* --- */
3387 3424
3388 win->menu.send_file = 3425 win->menu.send_file =
3389 gtk_item_factory_get_widget(win->menu.item_factory, 3426 gtk_item_factory_get_widget(win->menu.item_factory,
3390 N_("/Conversation/Send File...")); 3427 N_("/Conversation/Send File..."));
4728 } 4765 }
4729 4766
4730 static GtkWidget * 4767 static GtkWidget *
4731 setup_common_pane(PidginConversation *gtkconv) 4768 setup_common_pane(PidginConversation *gtkconv)
4732 { 4769 {
4733 GtkWidget *vbox, *frame, *imhtml_sw, *event_box; 4770 GtkWidget *vbox, *hpaned, *frame, *imhtml_sw, *event_box;
4734 GtkCellRenderer *rend; 4771 GtkCellRenderer *rend;
4735 GtkTreePath *path; 4772 GtkTreePath *path;
4736 PurpleConversation *conv = gtkconv->active_conv; 4773 PurpleConversation *conv = gtkconv->active_conv;
4737 PurpleBuddy *buddy; 4774 PurpleBuddy *buddy;
4738 gboolean chat = (conv->type == PURPLE_CONV_TYPE_CHAT); 4775 gboolean chat = (conv->type == PURPLE_CONV_TYPE_CHAT);
4739 GtkPolicyType imhtml_sw_hscroll; 4776 GtkPolicyType imhtml_sw_hscroll;
4740 int buddyicon_size = 0; 4777 int buddyicon_size = 0;
4741 4778
4742 /* Setup the top part of the pane */ 4779 /* Setup the top part of the pane */
4743 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 4780 gtkconv->topvbox = vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4744 gtk_widget_show(vbox); 4781 gtk_widget_show(vbox);
4745 4782
4746 /* Setup the info pane */ 4783 /* Setup the info pane */
4747 event_box = gtk_event_box_new(); 4784 event_box = gtk_event_box_new();
4748 #if GTK_CHECK_VERSION(2,4,0) 4785 #if GTK_CHECK_VERSION(2,4,0)
4808 g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL); 4845 g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL);
4809 4846
4810 /* Setup the gtkimhtml widget */ 4847 /* Setup the gtkimhtml widget */
4811 frame = pidgin_create_imhtml(FALSE, &gtkconv->imhtml, NULL, &imhtml_sw); 4848 frame = pidgin_create_imhtml(FALSE, &gtkconv->imhtml, NULL, &imhtml_sw);
4812 gtk_widget_set_size_request(gtkconv->imhtml, -1, 0); 4849 gtk_widget_set_size_request(gtkconv->imhtml, -1, 0);
4850
4851 /* Add the gtkimhtml frame */
4852 gtkconv->middle_hpaned = hpaned = gtk_hpaned_new();
4853 gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 0);
4854 gtk_widget_show(hpaned);
4855 gtk_paned_pack1(GTK_PANED(hpaned), frame, TRUE, TRUE);
4856
4813 if (chat) { 4857 if (chat) {
4814 GtkWidget *hpaned;
4815
4816 /* Add the topic */ 4858 /* Add the topic */
4817 setup_chat_topic(gtkconv, vbox); 4859 setup_chat_topic(gtkconv, vbox);
4818 4860
4819 /* Add the gtkimhtml frame */
4820 hpaned = gtk_hpaned_new();
4821 gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 0);
4822 gtk_widget_show(hpaned);
4823 gtk_paned_pack1(GTK_PANED(hpaned), frame, TRUE, TRUE);
4824
4825 /* Now add the userlist */ 4861 /* Now add the userlist */
4826 setup_chat_userlist(gtkconv, hpaned); 4862 setup_chat_userlist(gtkconv, hpaned);
4827 } else { 4863 }
4828 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); 4864
4829 }
4830 gtk_widget_show(frame); 4865 gtk_widget_show(frame);
4831 4866
4832 gtk_widget_set_name(gtkconv->imhtml, "pidgin_conv_imhtml"); 4867 gtk_widget_set_name(gtkconv->imhtml, "pidgin_conv_imhtml");
4833 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml),TRUE); 4868 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml),TRUE);
4834 4869
6342 if (conv->features & PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY) 6377 if (conv->features & PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY)
6343 buttons |= GTK_IMHTML_CUSTOM_SMILEY; 6378 buttons |= GTK_IMHTML_CUSTOM_SMILEY;
6344 else 6379 else
6345 buttons &= ~GTK_IMHTML_CUSTOM_SMILEY; 6380 buttons &= ~GTK_IMHTML_CUSTOM_SMILEY;
6346 6381
6382 #ifdef USE_VV
6383 /* check if account support voice calls, and if the current buddy
6384 supports it */
6385 if (account != NULL && purple_conversation_get_type(conv)
6386 == PURPLE_CONV_TYPE_IM
6387 && gtkconv->gtkmedia == NULL) {
6388 gboolean audio = purple_prpl_can_do_media(account,
6389 purple_conversation_get_name(conv),
6390 PURPLE_MEDIA_AUDIO);
6391 gboolean video = purple_prpl_can_do_media(account,
6392 purple_conversation_get_name(conv),
6393 PURPLE_MEDIA_VIDEO);
6394 gboolean av = purple_prpl_can_do_media(account,
6395 purple_conversation_get_name(conv),
6396 PURPLE_MEDIA_AUDIO | PURPLE_MEDIA_VIDEO);
6397
6398 gtk_widget_set_sensitive(win->menu.audio_call, audio ? TRUE : FALSE);
6399 gtk_widget_set_sensitive(win->menu.video_call, video ? TRUE : FALSE);
6400 gtk_widget_set_sensitive(win->menu.audio_video_call, av ? TRUE : FALSE);
6401 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {
6402 /* for now, don't care about chats... */
6403 gtk_widget_set_sensitive(win->menu.audio_call, FALSE);
6404 gtk_widget_set_sensitive(win->menu.video_call, FALSE);
6405 gtk_widget_set_sensitive(win->menu.audio_video_call, FALSE);
6406 } else {
6407 gtk_widget_set_sensitive(win->menu.audio_call, FALSE);
6408 gtk_widget_set_sensitive(win->menu.video_call, FALSE);
6409 gtk_widget_set_sensitive(win->menu.audio_video_call, FALSE);
6410 }
6411 #endif
6412
6347 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons); 6413 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons);
6348 if (account != NULL) 6414 if (account != NULL)
6349 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account)); 6415 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account));
6350 6416
6351 /* Deal with menu items */ 6417 /* Deal with menu items */
6879 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event); 6945 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event);
6880 #if GTK_CHECK_VERSION(2,4,0) 6946 #if GTK_CHECK_VERSION(2,4,0)
6881 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE); 6947 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE);
6882 #endif 6948 #endif
6883 gtk_widget_add_events(event, 6949 gtk_widget_add_events(event,
6884 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); 6950 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK);
6885 g_signal_connect(G_OBJECT(event), "button-press-event", 6951 g_signal_connect(G_OBJECT(event), "button-press-event",
6886 G_CALLBACK(icon_menu), gtkconv); 6952 G_CALLBACK(icon_menu), gtkconv);
6887 6953
6888 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL); 6954 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL);
6889 gtk_widget_show(event); 6955 gtk_widget_show(event);
7622 } 7688 }
7623 7689
7624 return TRUE; 7690 return TRUE;
7625 } 7691 }
7626 7692
7693
7694 #ifdef USE_VV
7695
7696 static void
7697 pidgin_gtkmedia_message_cb(PidginMedia *media, const char *msg, PurpleConversation *conv)
7698 {
7699 purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, msg, PURPLE_MESSAGE_SYSTEM, time(NULL));
7700 }
7701
7702 static void
7703 menu_initiate_audio_call_cb(gpointer data, guint action, GtkWidget *widget)
7704 {
7705 PidginWindow *win = (PidginWindow *)data;
7706 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
7707 PurpleAccount *account = purple_conversation_get_account(conv);
7708
7709 PurpleMedia *media =
7710 purple_prpl_initiate_media(account,
7711 purple_conversation_get_name(conv),
7712 PURPLE_MEDIA_AUDIO);
7713
7714 if (media)
7715 purple_media_wait(media);
7716 }
7717
7718 static void
7719 menu_initiate_video_call_cb(gpointer data, guint action, GtkWidget *widget)
7720 {
7721 PidginWindow *win = (PidginWindow *)data;
7722 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
7723 PurpleAccount *account = purple_conversation_get_account(conv);
7724
7725 PurpleMedia *media =
7726 purple_prpl_initiate_media(account,
7727 purple_conversation_get_name(conv),
7728 PURPLE_MEDIA_VIDEO);
7729
7730 if (media)
7731 purple_media_wait(media);
7732 }
7733
7734 static void
7735 menu_initiate_audio_video_call_cb(gpointer data, guint action, GtkWidget *widget)
7736 {
7737 PidginWindow *win = (PidginWindow *)data;
7738 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
7739 PurpleAccount *account = purple_conversation_get_account(conv);
7740
7741 PurpleMedia *media =
7742 purple_prpl_initiate_media(account,
7743 purple_conversation_get_name(conv),
7744 PURPLE_MEDIA_AUDIO | PURPLE_MEDIA_VIDEO);
7745
7746 if (media)
7747 purple_media_wait(media);
7748 }
7749
7750 static void
7751 pidgin_conv_gtkmedia_destroyed(GtkWidget *widget, PidginConversation *gtkconv)
7752 {
7753 gtk_widget_destroyed(widget, &(gtkconv->gtkmedia));
7754 gray_stuff_out(gtkconv);
7755 }
7756
7757 static gboolean
7758 pidgin_conv_new_media_cb(PurpleMediaManager *manager, PurpleMedia *media, gpointer nul)
7759 {
7760 GtkWidget *gtkmedia;
7761 PurpleConversation *conv;
7762 PidginConversation *gtkconv;
7763 gchar *name = purple_media_get_screenname(media);
7764
7765 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM,
7766 purple_connection_get_account(
7767 purple_media_get_connection(media)), name);
7768 g_free(name);
7769
7770 gtkconv = PIDGIN_CONVERSATION(conv);
7771
7772 if (gtkconv->gtkmedia) {
7773 purple_debug_info("gtkconv", "Media session exists for this conversation.\n");
7774 return FALSE;
7775 }
7776
7777 gtkmedia = pidgin_media_new(media);
7778 gtk_box_pack_start(GTK_BOX(gtkconv->topvbox), gtkmedia, FALSE, FALSE, 0);
7779 gtk_widget_show(gtkmedia);
7780 g_signal_connect(G_OBJECT(gtkmedia), "message", G_CALLBACK(pidgin_gtkmedia_message_cb), conv);
7781
7782 gtkconv->gtkmedia = gtkmedia;
7783 g_signal_connect(G_OBJECT(gtkmedia), "destroy", G_CALLBACK(
7784 pidgin_conv_gtkmedia_destroyed), gtkconv);
7785
7786 gtk_paned_pack2(GTK_PANED(gtkconv->middle_hpaned),
7787 pidgin_media_get_display_widget(gtkmedia), FALSE, TRUE);
7788
7789 gray_stuff_out(gtkconv);
7790 return TRUE;
7791 }
7792
7793 #endif
7794
7627 void * 7795 void *
7628 pidgin_conversations_get_handle(void) 7796 pidgin_conversations_get_handle(void)
7629 { 7797 {
7630 static int handle; 7798 static int handle;
7631 7799
7722 show_buddy_icons_pref_cb, NULL); 7890 show_buddy_icons_pref_cb, NULL);
7723 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/blist/show_protocol_icons", 7891 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/blist/show_protocol_icons",
7724 show_protocol_icons_pref_cb, NULL); 7892 show_protocol_icons_pref_cb, NULL);
7725 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/hide_new", 7893 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/hide_new",
7726 hide_new_pref_cb, NULL); 7894 hide_new_pref_cb, NULL);
7727 7895 #ifdef USE_VV
7896 g_signal_connect(G_OBJECT(purple_media_manager_get()), "init-media",
7897 G_CALLBACK(pidgin_conv_new_media_cb), NULL);
7898 #endif
7728 7899
7729 7900
7730 /********************************************************************** 7901 /**********************************************************************
7731 * Register signals 7902 * Register signals
7732 **********************************************************************/ 7903 **********************************************************************/