pidgin/gtkconv.c

branch
soc.2008.vv
changeset 23740
e63886b13597
parent 23500
e39b78b393fe
parent 23736
e77595cce169
child 23745
091a506a7018
equal deleted inserted replaced
23535:75c369b8147f 23740:e63886b13597
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..."));
4725 } 4762 }
4726 4763
4727 static GtkWidget * 4764 static GtkWidget *
4728 setup_common_pane(PidginConversation *gtkconv) 4765 setup_common_pane(PidginConversation *gtkconv)
4729 { 4766 {
4730 GtkWidget *vbox, *frame, *imhtml_sw, *event_box; 4767 GtkWidget *vbox, *hpaned, *frame, *imhtml_sw, *event_box;
4731 GtkCellRenderer *rend; 4768 GtkCellRenderer *rend;
4732 GtkTreePath *path; 4769 GtkTreePath *path;
4733 PurpleConversation *conv = gtkconv->active_conv; 4770 PurpleConversation *conv = gtkconv->active_conv;
4734 PurpleBuddy *buddy; 4771 PurpleBuddy *buddy;
4735 gboolean chat = (conv->type == PURPLE_CONV_TYPE_CHAT); 4772 gboolean chat = (conv->type == PURPLE_CONV_TYPE_CHAT);
4736 GtkPolicyType imhtml_sw_hscroll; 4773 GtkPolicyType imhtml_sw_hscroll;
4737 int buddyicon_size = 0; 4774 int buddyicon_size = 0;
4738 4775
4739 /* Setup the top part of the pane */ 4776 /* Setup the top part of the pane */
4740 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 4777 gtkconv->topvbox = vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
4741 gtk_widget_show(vbox); 4778 gtk_widget_show(vbox);
4742 4779
4743 /* Setup the info pane */ 4780 /* Setup the info pane */
4744 event_box = gtk_event_box_new(); 4781 event_box = gtk_event_box_new();
4745 #if GTK_CHECK_VERSION(2,4,0) 4782 #if GTK_CHECK_VERSION(2,4,0)
4805 g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL); 4842 g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL);
4806 4843
4807 /* Setup the gtkimhtml widget */ 4844 /* Setup the gtkimhtml widget */
4808 frame = pidgin_create_imhtml(FALSE, &gtkconv->imhtml, NULL, &imhtml_sw); 4845 frame = pidgin_create_imhtml(FALSE, &gtkconv->imhtml, NULL, &imhtml_sw);
4809 gtk_widget_set_size_request(gtkconv->imhtml, -1, 0); 4846 gtk_widget_set_size_request(gtkconv->imhtml, -1, 0);
4847
4848 /* Add the gtkimhtml frame */
4849 gtkconv->middle_hpaned = hpaned = gtk_hpaned_new();
4850 gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 0);
4851 gtk_widget_show(hpaned);
4852 gtk_paned_pack1(GTK_PANED(hpaned), frame, TRUE, TRUE);
4853
4810 if (chat) { 4854 if (chat) {
4811 GtkWidget *hpaned;
4812
4813 /* Add the topic */ 4855 /* Add the topic */
4814 setup_chat_topic(gtkconv, vbox); 4856 setup_chat_topic(gtkconv, vbox);
4815 4857
4816 /* Add the gtkimhtml frame */
4817 hpaned = gtk_hpaned_new();
4818 gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 0);
4819 gtk_widget_show(hpaned);
4820 gtk_paned_pack1(GTK_PANED(hpaned), frame, TRUE, TRUE);
4821
4822 /* Now add the userlist */ 4858 /* Now add the userlist */
4823 setup_chat_userlist(gtkconv, hpaned); 4859 setup_chat_userlist(gtkconv, hpaned);
4824 } else { 4860 }
4825 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); 4861
4826 }
4827 gtk_widget_show(frame); 4862 gtk_widget_show(frame);
4828 4863
4829 gtk_widget_set_name(gtkconv->imhtml, "pidgin_conv_imhtml"); 4864 gtk_widget_set_name(gtkconv->imhtml, "pidgin_conv_imhtml");
4830 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml),TRUE); 4865 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml),TRUE);
4831 4866
6340 if (conv->features & PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY) 6375 if (conv->features & PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY)
6341 buttons |= GTK_IMHTML_CUSTOM_SMILEY; 6376 buttons |= GTK_IMHTML_CUSTOM_SMILEY;
6342 else 6377 else
6343 buttons &= ~GTK_IMHTML_CUSTOM_SMILEY; 6378 buttons &= ~GTK_IMHTML_CUSTOM_SMILEY;
6344 6379
6380 #ifdef USE_VV
6381 /* check if account support voice calls, and if the current buddy
6382 supports it */
6383 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
6384 gboolean audio = serv_can_do_media(gc, purple_conversation_get_name(conv),
6385 PURPLE_MEDIA_AUDIO);
6386 gboolean video = serv_can_do_media(gc, purple_conversation_get_name(conv),
6387 PURPLE_MEDIA_VIDEO);
6388 gboolean av = serv_can_do_media(gc, purple_conversation_get_name(conv),
6389 PURPLE_MEDIA_AUDIO | PURPLE_MEDIA_VIDEO);
6390
6391 gtk_widget_set_sensitive(win->menu.audio_call, audio ? TRUE : FALSE);
6392 gtk_widget_set_sensitive(win->menu.video_call, video ? TRUE : FALSE);
6393 gtk_widget_set_sensitive(win->menu.audio_video_call, av ? TRUE : FALSE);
6394 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {
6395 /* for now, don't care about chats... */
6396 gtk_widget_set_sensitive(win->menu.audio_call, FALSE);
6397 gtk_widget_set_sensitive(win->menu.video_call, FALSE);
6398 gtk_widget_set_sensitive(win->menu.audio_video_call, FALSE);
6399 } else {
6400 gtk_widget_set_sensitive(win->menu.audio_call, FALSE);
6401 gtk_widget_set_sensitive(win->menu.video_call, FALSE);
6402 gtk_widget_set_sensitive(win->menu.audio_video_call, FALSE);
6403 }
6404 #endif
6405
6345 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons); 6406 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons);
6346 if (account != NULL) 6407 if (account != NULL)
6347 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account)); 6408 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account));
6348 6409
6349 /* Deal with menu items */ 6410 /* Deal with menu items */
6874 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event); 6935 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event);
6875 #if GTK_CHECK_VERSION(2,4,0) 6936 #if GTK_CHECK_VERSION(2,4,0)
6876 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE); 6937 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE);
6877 #endif 6938 #endif
6878 gtk_widget_add_events(event, 6939 gtk_widget_add_events(event,
6879 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); 6940 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK);
6880 g_signal_connect(G_OBJECT(event), "button-press-event", 6941 g_signal_connect(G_OBJECT(event), "button-press-event",
6881 G_CALLBACK(icon_menu), gtkconv); 6942 G_CALLBACK(icon_menu), gtkconv);
6882 6943
6883 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL); 6944 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL);
6884 gtk_widget_show(event); 6945 gtk_widget_show(event);
7607 } 7668 }
7608 7669
7609 return TRUE; 7670 return TRUE;
7610 } 7671 }
7611 7672
7673
7674 #ifdef USE_VV
7675
7676 static void
7677 pidgin_gtkmedia_message_cb(PidginMedia *media, const char *msg, PurpleConversation *conv)
7678 {
7679 purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, msg, PURPLE_MESSAGE_SYSTEM, time(NULL));
7680 }
7681
7682 static void
7683 menu_initiate_audio_call_cb(gpointer data, guint action, GtkWidget *widget)
7684 {
7685 PidginWindow *win = (PidginWindow *)data;
7686 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
7687 PurpleConnection *gc = purple_conversation_get_gc(conv);
7688
7689 PurpleMedia *media =
7690 serv_initiate_media(gc,
7691 purple_conversation_get_name(conv),
7692 PURPLE_MEDIA_AUDIO);
7693
7694 if (media)
7695 purple_media_wait(media);
7696 }
7697
7698 static void
7699 menu_initiate_video_call_cb(gpointer data, guint action, GtkWidget *widget)
7700 {
7701 PidginWindow *win = (PidginWindow *)data;
7702 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
7703 PurpleConnection *gc = purple_conversation_get_gc(conv);
7704
7705 PurpleMedia *media =
7706 serv_initiate_media(gc,
7707 purple_conversation_get_name(conv),
7708 PURPLE_MEDIA_VIDEO);
7709
7710 purple_media_wait(media);
7711 }
7712
7713 static void
7714 menu_initiate_audio_video_call_cb(gpointer data, guint action, GtkWidget *widget)
7715 {
7716 PidginWindow *win = (PidginWindow *)data;
7717 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
7718 PurpleConnection *gc = purple_conversation_get_gc(conv);
7719
7720 PurpleMedia *media =
7721 serv_initiate_media(gc,
7722 purple_conversation_get_name(conv),
7723 PURPLE_MEDIA_AUDIO | PURPLE_MEDIA_VIDEO);
7724
7725 purple_media_wait(media);
7726 }
7727
7728 static void
7729 pidgin_conv_new_media_cb(PurpleMediaManager *manager, PurpleMedia *media, gpointer nul)
7730 {
7731 GtkWidget *gtkmedia;
7732 PurpleConversation *conv;
7733 PidginConversation *gtkconv;
7734
7735 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM,
7736 purple_connection_get_account(purple_media_get_connection(media)),
7737 purple_media_get_screenname(media));
7738 gtkconv = PIDGIN_CONVERSATION(conv);
7739 if (gtkconv->gtkmedia)
7740 gtk_widget_destroy(gtkconv->gtkmedia);
7741
7742 gtkmedia = pidgin_media_new(media);
7743 gtk_box_pack_start(GTK_BOX(gtkconv->topvbox), gtkmedia, FALSE, FALSE, 0);
7744 gtk_widget_show(gtkmedia);
7745 g_signal_connect(G_OBJECT(gtkmedia), "message", G_CALLBACK(pidgin_gtkmedia_message_cb), conv);
7746
7747 gtkconv->gtkmedia = gtkmedia;
7748 g_signal_connect(G_OBJECT(gtkmedia), "destroy", G_CALLBACK(gtk_widget_destroyed), &(gtkconv->gtkmedia));
7749
7750 gtk_paned_pack2(GTK_PANED(gtkconv->middle_hpaned),
7751 pidgin_media_get_display_widget(gtkmedia), FALSE, TRUE);
7752 }
7753
7754 #endif
7755
7612 void * 7756 void *
7613 pidgin_conversations_get_handle(void) 7757 pidgin_conversations_get_handle(void)
7614 { 7758 {
7615 static int handle; 7759 static int handle;
7616 7760
7707 show_buddy_icons_pref_cb, NULL); 7851 show_buddy_icons_pref_cb, NULL);
7708 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/blist/show_protocol_icons", 7852 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/blist/show_protocol_icons",
7709 show_protocol_icons_pref_cb, NULL); 7853 show_protocol_icons_pref_cb, NULL);
7710 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/hide_new", 7854 purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/hide_new",
7711 hide_new_pref_cb, NULL); 7855 hide_new_pref_cb, NULL);
7712 7856 #ifdef USE_VV
7857 g_signal_connect(G_OBJECT(purple_media_manager_get()), "init-media",
7858 G_CALLBACK(pidgin_conv_new_media_cb), NULL);
7859 #endif
7713 7860
7714 7861
7715 /********************************************************************** 7862 /**********************************************************************
7716 * Register signals 7863 * Register signals
7717 **********************************************************************/ 7864 **********************************************************************/

mercurial