diff pidgin/gtkconv.c @ 25662:28ab41065172

Create a proper media menu with options for audio, video, and audio/video.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Sat, 31 May 2008 06:29:38 +0000
parents 10f5a529d2a6
children de644f7e3958
line wrap: on
line diff
--- a/pidgin/gtkconv.c	Sat May 31 04:01:18 2008 +0000
+++ b/pidgin/gtkconv.c	Sat May 31 06:29:38 2008 +0000
@@ -1200,7 +1200,11 @@
 /* Forward declare this here, because I want to keep VV-related stuff together
 for now */
 static void 
-menu_initiate_voice_call_cb(gpointer data, guint action, GtkWidget *widget);
+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
 
@@ -3064,8 +3068,14 @@
 	{ "/Conversation/sep1", NULL, NULL, 0, "<Separator>", NULL },
 
 #ifdef USE_VV
-	{ N_("/Conversation/_Voice Call..."), NULL, menu_initiate_voice_call_cb, 0,
-		"<StockItem>", PIDGIN_STOCK_TOOLBAR_CALL},
+	{ 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_AUDIO_VIDEO_CALL },
 #endif
 
 	{ N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_SEND_FILE },
@@ -3378,9 +3388,15 @@
 		                            N_("/Conversation/View Log"));
 
 #ifdef USE_VV
-	win->menu.call =
+	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/Voice Call..."));
+					    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
 	
 	/* --- */
@@ -6346,21 +6362,33 @@
 		/* check if account support voice calls, and if the current buddy
 			supports it */
 		if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
-			if (serv_can_do_media(gc, purple_conversation_get_name(conv), 
-						PURPLE_MEDIA_RECV_AUDIO & PURPLE_MEDIA_SEND_AUDIO)) {
+			gboolean audio = serv_can_do_media(gc, purple_conversation_get_name(conv), 
+							   PURPLE_MEDIA_AUDIO);
+			gboolean video = serv_can_do_media(gc, purple_conversation_get_name(conv), 
+							   PURPLE_MEDIA_VIDEO);
+			gboolean av = serv_can_do_media(gc, purple_conversation_get_name(conv),
+							PURPLE_MEDIA_AUDIO | PURPLE_MEDIA_VIDEO);
+			if (audio) {
 				buttons |= GTK_IMHTML_CALL;
-				gtk_widget_set_sensitive(win->menu.call, TRUE);
+				gtk_widget_set_sensitive(win->menu.audio_call, TRUE);
 			} else {
 				buttons &= ~GTK_IMHTML_CALL;
-				gtk_widget_set_sensitive(win->menu.call, FALSE);
+				gtk_widget_set_sensitive(win->menu.audio_call, 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... */
 			buttons &= ~GTK_IMHTML_CALL;
-			gtk_widget_set_sensitive(win->menu.call, FALSE);
+			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 {
 			buttons &= ~GTK_IMHTML_CALL;
-			gtk_widget_set_sensitive(win->menu.call, FALSE);
+			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
 		
@@ -7641,7 +7669,7 @@
 }
 
 static void
-menu_initiate_voice_call_cb(gpointer data, guint action, GtkWidget *widget)
+menu_initiate_audio_call_cb(gpointer data, guint action, GtkWidget *widget)
 {
 	PidginWindow *win = (PidginWindow *)data;
 	PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
@@ -7649,14 +7677,44 @@
 
 	PurpleMedia *media =
 		serv_initiate_media(gc,
-							purple_conversation_get_name(conv),
-							PURPLE_MEDIA_RECV_AUDIO & PURPLE_MEDIA_SEND_AUDIO);
+				    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);
+	PurpleConnection *gc = purple_conversation_get_gc(conv);
+
+	PurpleMedia *media =
+		serv_initiate_media(gc,
+				    purple_conversation_get_name(conv),
+				    PURPLE_MEDIA_VIDEO);
+
+	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);
+	PurpleConnection *gc = purple_conversation_get_gc(conv);
+
+	PurpleMedia *media =
+		serv_initiate_media(gc,
+				    purple_conversation_get_name(conv),
+				    PURPLE_MEDIA_AUDIO & PURPLE_MEDIA_VIDEO);
+
+	purple_media_wait(media);
+}
+
+static void
 pidgin_conv_new_media_cb(PurpleMediaManager *manager, PurpleMedia *media, gpointer nul)
 {
 	GstElement *sendbin, *sendlevel;