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