| 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, >kconv->imhtml, NULL, &imhtml_sw); |
4845 frame = pidgin_create_imhtml(FALSE, >kconv->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 **********************************************************************/ |