Mercurial > pidgin.yaz
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, >kconv->imhtml, NULL, &imhtml_sw); | 4848 frame = pidgin_create_imhtml(FALSE, >kconv->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 **********************************************************************/ |