Mercurial > pidgin.yaz
diff pidgin/gtkconv.c @ 26015:bb99ee66120e
propagate from branch 'im.pidgin.pidgin' (head 25e6cb3cd762fe0e3dbb5ce67dd017555c8a26a8)
to branch 'im.pidgin.maiku.vv' (head 33c389f28f8fbefb95f7cf1bc22730ffd1d92bcb)
author | Mike Ruprecht <maiku@soc.pidgin.im> |
---|---|
date | Fri, 05 Sep 2008 02:57:48 +0000 |
parents | a0381a68ceef f89bdd34c9f1 |
children | 4d752d07a126 |
line wrap: on
line diff
--- a/pidgin/gtkconv.c Thu Sep 04 22:56:26 2008 +0000 +++ b/pidgin/gtkconv.c Fri Sep 05 02:57:48 2008 +0000 @@ -46,6 +46,7 @@ #include "idle.h" #include "imgstore.h" #include "log.h" +#include "mediamanager.h" #include "notify.h" #include "prpl.h" #include "request.h" @@ -60,6 +61,7 @@ #include "gtkimhtml.h" #include "gtkimhtmltoolbar.h" #include "gtklog.h" +#include "gtkmedia.h" #include "gtkmenutray.h" #include "gtkpounce.h" #include "gtkprefs.h" @@ -1194,6 +1196,18 @@ gtk_widget_grab_focus(s->entry); } +#ifdef USE_VV +/* Forward declare this here, because I want to keep VV-related stuff together +for now */ +static void +menu_initiate_audio_call_cb(gpointer data, guint action, GtkWidget *widget); +static void +menu_initiate_video_call_cb(gpointer data, guint action, GtkWidget *widget); +static void +menu_initiate_audio_video_call_cb(gpointer data, guint action, GtkWidget *widget); + +#endif + static void menu_send_file_cb(gpointer data, guint action, GtkWidget *widget) { @@ -3073,6 +3087,17 @@ { "/Conversation/sep1", NULL, NULL, 0, "<Separator>", NULL }, +#ifdef USE_VV + { N_("/Conversation/M_edia"), NULL, NULL, 0, "<Branch>", NULL }, + + { N_("/Conversation/Media/_Audio Call"), NULL, menu_initiate_audio_call_cb, 0, + "<StockItem>", PIDGIN_STOCK_TOOLBAR_AUDIO_CALL }, + { N_("/Conversation/Media/_Video Call"), NULL, menu_initiate_video_call_cb, 0, + "<StockItem>", PIDGIN_STOCK_TOOLBAR_VIDEO_CALL }, + { N_("/Conversation/Media/Audio\\/Video _Call"), NULL, menu_initiate_audio_video_call_cb, 0, + "<StockItem>", PIDGIN_STOCK_TOOLBAR_VIDEO_CALL }, +#endif + { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_SEND_FILE }, { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb, 0, "<Item>", NULL }, @@ -3383,6 +3408,18 @@ gtk_item_factory_get_widget(win->menu.item_factory, N_("/Conversation/View Log")); +#ifdef USE_VV + win->menu.audio_call = + gtk_item_factory_get_widget(win->menu.item_factory, + N_("/Conversation/Media/Audio Call")); + win->menu.video_call = + gtk_item_factory_get_widget(win->menu.item_factory, + N_("/Conversation/Media/Video Call")); + win->menu.audio_video_call = + gtk_item_factory_get_widget(win->menu.item_factory, + N_("/Conversation/Media/Audio\\/Video Call")); +#endif + /* --- */ win->menu.send_file = @@ -4730,7 +4767,7 @@ static GtkWidget * setup_common_pane(PidginConversation *gtkconv) { - GtkWidget *vbox, *frame, *imhtml_sw, *event_box; + GtkWidget *vbox, *hpaned, *frame, *imhtml_sw, *event_box; GtkCellRenderer *rend; GtkTreePath *path; PurpleConversation *conv = gtkconv->active_conv; @@ -4740,7 +4777,7 @@ int buddyicon_size = 0; /* Setup the top part of the pane */ - vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); + gtkconv->topvbox = vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); gtk_widget_show(vbox); /* Setup the info pane */ @@ -4810,23 +4847,21 @@ /* Setup the gtkimhtml widget */ frame = pidgin_create_imhtml(FALSE, >kconv->imhtml, NULL, &imhtml_sw); gtk_widget_set_size_request(gtkconv->imhtml, -1, 0); + + /* Add the gtkimhtml frame */ + gtkconv->middle_hpaned = hpaned = gtk_hpaned_new(); + gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 0); + gtk_widget_show(hpaned); + gtk_paned_pack1(GTK_PANED(hpaned), frame, TRUE, TRUE); + if (chat) { - GtkWidget *hpaned; - /* Add the topic */ setup_chat_topic(gtkconv, vbox); - /* Add the gtkimhtml frame */ - hpaned = gtk_hpaned_new(); - gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 0); - gtk_widget_show(hpaned); - gtk_paned_pack1(GTK_PANED(hpaned), frame, TRUE, TRUE); - /* Now add the userlist */ setup_chat_userlist(gtkconv, hpaned); - } else { - gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); - } + } + gtk_widget_show(frame); gtk_widget_set_name(gtkconv->imhtml, "pidgin_conv_imhtml"); @@ -6345,6 +6380,37 @@ else buttons &= ~GTK_IMHTML_CUSTOM_SMILEY; +#ifdef USE_VV + /* check if account support voice calls, and if the current buddy + supports it */ + if (account != NULL && purple_conversation_get_type(conv) + == PURPLE_CONV_TYPE_IM + && gtkconv->gtkmedia == NULL) { + gboolean audio = purple_prpl_can_do_media(account, + purple_conversation_get_name(conv), + PURPLE_MEDIA_AUDIO); + gboolean video = purple_prpl_can_do_media(account, + purple_conversation_get_name(conv), + PURPLE_MEDIA_VIDEO); + gboolean av = purple_prpl_can_do_media(account, + purple_conversation_get_name(conv), + PURPLE_MEDIA_AUDIO | PURPLE_MEDIA_VIDEO); + + gtk_widget_set_sensitive(win->menu.audio_call, audio ? TRUE : FALSE); + gtk_widget_set_sensitive(win->menu.video_call, video ? TRUE : FALSE); + gtk_widget_set_sensitive(win->menu.audio_video_call, av ? TRUE : FALSE); + } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { + /* for now, don't care about chats... */ + gtk_widget_set_sensitive(win->menu.audio_call, FALSE); + gtk_widget_set_sensitive(win->menu.video_call, FALSE); + gtk_widget_set_sensitive(win->menu.audio_video_call, FALSE); + } else { + gtk_widget_set_sensitive(win->menu.audio_call, FALSE); + gtk_widget_set_sensitive(win->menu.video_call, FALSE); + gtk_widget_set_sensitive(win->menu.audio_video_call, FALSE); + } +#endif + gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons); if (account != NULL) gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account)); @@ -6882,7 +6948,7 @@ gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE); #endif gtk_widget_add_events(event, - GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); + GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); g_signal_connect(G_OBJECT(event), "button-press-event", G_CALLBACK(icon_menu), gtkconv); @@ -7627,6 +7693,108 @@ return TRUE; } + +#ifdef USE_VV + +static void +pidgin_gtkmedia_message_cb(PidginMedia *media, const char *msg, PurpleConversation *conv) +{ + purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, msg, PURPLE_MESSAGE_SYSTEM, time(NULL)); +} + +static void +menu_initiate_audio_call_cb(gpointer data, guint action, GtkWidget *widget) +{ + PidginWindow *win = (PidginWindow *)data; + PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); + PurpleAccount *account = purple_conversation_get_account(conv); + + PurpleMedia *media = + purple_prpl_initiate_media(account, + purple_conversation_get_name(conv), + PURPLE_MEDIA_AUDIO); + + if (media) + purple_media_wait(media); +} + +static void +menu_initiate_video_call_cb(gpointer data, guint action, GtkWidget *widget) +{ + PidginWindow *win = (PidginWindow *)data; + PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); + PurpleAccount *account = purple_conversation_get_account(conv); + + PurpleMedia *media = + purple_prpl_initiate_media(account, + purple_conversation_get_name(conv), + PURPLE_MEDIA_VIDEO); + + if (media) + purple_media_wait(media); +} + +static void +menu_initiate_audio_video_call_cb(gpointer data, guint action, GtkWidget *widget) +{ + PidginWindow *win = (PidginWindow *)data; + PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); + PurpleAccount *account = purple_conversation_get_account(conv); + + PurpleMedia *media = + purple_prpl_initiate_media(account, + purple_conversation_get_name(conv), + PURPLE_MEDIA_AUDIO | PURPLE_MEDIA_VIDEO); + + if (media) + purple_media_wait(media); +} + +static void +pidgin_conv_gtkmedia_destroyed(GtkWidget *widget, PidginConversation *gtkconv) +{ + gtk_widget_destroyed(widget, &(gtkconv->gtkmedia)); + gray_stuff_out(gtkconv); +} + +static gboolean +pidgin_conv_new_media_cb(PurpleMediaManager *manager, PurpleMedia *media, gpointer nul) +{ + GtkWidget *gtkmedia; + PurpleConversation *conv; + PidginConversation *gtkconv; + gchar *name = purple_media_get_screenname(media); + + conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, + purple_connection_get_account( + purple_media_get_connection(media)), name); + g_free(name); + + gtkconv = PIDGIN_CONVERSATION(conv); + + if (gtkconv->gtkmedia) { + purple_debug_info("gtkconv", "Media session exists for this conversation.\n"); + return FALSE; + } + + gtkmedia = pidgin_media_new(media); + gtk_box_pack_start(GTK_BOX(gtkconv->topvbox), gtkmedia, FALSE, FALSE, 0); + gtk_widget_show(gtkmedia); + g_signal_connect(G_OBJECT(gtkmedia), "message", G_CALLBACK(pidgin_gtkmedia_message_cb), conv); + + gtkconv->gtkmedia = gtkmedia; + g_signal_connect(G_OBJECT(gtkmedia), "destroy", G_CALLBACK( + pidgin_conv_gtkmedia_destroyed), gtkconv); + + gtk_paned_pack2(GTK_PANED(gtkconv->middle_hpaned), + pidgin_media_get_display_widget(gtkmedia), FALSE, TRUE); + + gray_stuff_out(gtkconv); + return TRUE; +} + +#endif + void * pidgin_conversations_get_handle(void) { @@ -7727,7 +7895,10 @@ show_protocol_icons_pref_cb, NULL); purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/hide_new", hide_new_pref_cb, NULL); - +#ifdef USE_VV + g_signal_connect(G_OBJECT(purple_media_manager_get()), "init-media", + G_CALLBACK(pidgin_conv_new_media_cb), NULL); +#endif /**********************************************************************