changeset 26063:685c8f5f85c7

Separate PidginMedia from PidginConversation.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Fri, 30 Jan 2009 04:40:54 +0000
parents 2091094745d9
children 4f013819e4e3
files libpurple/media.c libpurple/protocols/jabber/jabber.c pidgin/gtkconv.c pidgin/gtkconv.h pidgin/gtkmain.c pidgin/gtkmedia.c pidgin/gtkmedia.h
diffstat 7 files changed, 73 insertions(+), 100 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/media.c	Fri Jan 30 01:23:35 2009 +0000
+++ b/libpurple/media.c	Fri Jan 30 04:40:54 2009 +0000
@@ -1271,10 +1271,12 @@
 purple_media_end(PurpleMedia *media,
 		const gchar *session_id, const gchar *participant)
 {
-	if (session_id == NULL && participant == NULL)
+	if (session_id == NULL && participant == NULL) {
 		g_signal_emit(media, purple_media_signals[STATE_CHANGED],
 				0, PURPLE_MEDIA_STATE_CHANGED_END,
 				NULL, NULL);
+		g_object_unref(media);
+	}
 }
 
 GList*
--- a/libpurple/protocols/jabber/jabber.c	Fri Jan 30 01:23:35 2009 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Fri Jan 30 04:40:54 2009 +0000
@@ -2067,9 +2067,6 @@
 	if(!(jid = jabber_id_new(who)))
 		return;
 
-#ifdef USE_VV
-	jingle_rtp_terminate_session(js, who);
-#endif
 	if((jb = jabber_buddy_find(js, who, TRUE)) &&
 			(jbr = jabber_buddy_find_resource(jb, jid->resource))) {
 		if(jbr->thread_id) {
--- a/pidgin/gtkconv.c	Fri Jan 30 01:23:35 2009 +0000
+++ b/pidgin/gtkconv.c	Fri Jan 30 04:40:54 2009 +0000
@@ -48,7 +48,6 @@
 #include "idle.h"
 #include "imgstore.h"
 #include "log.h"
-#include "mediamanager.h"
 #include "notify.h"
 #include "prpl.h"
 #include "request.h"
@@ -63,7 +62,6 @@
 #include "gtkimhtml.h"
 #include "gtkimhtmltoolbar.h"
 #include "gtklog.h"
-#include "gtkmedia.h"
 #include "gtkmenutray.h"
 #include "gtkpounce.h"
 #include "gtkprefs.h"
@@ -4818,10 +4816,7 @@
 	int buddyicon_size = 0;
 
 	/* Setup the top part of the pane */
-	gtkconv->tophbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
-	gtk_widget_show(gtkconv->tophbox);
 	vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
-	gtk_box_pack_start(GTK_BOX(gtkconv->tophbox), vbox, TRUE, TRUE, 0);
 	gtk_widget_show(vbox);
 
 	/* Setup the info pane */
@@ -4970,7 +4965,7 @@
 	default_formatize(gtkconv);
 	g_signal_connect_after(G_OBJECT(gtkconv->entry), "format_function_clear",
 	                       G_CALLBACK(clear_formatting_cb), gtkconv);
-	return gtkconv->tophbox;
+	return vbox;
 }
 
 static void
@@ -6450,8 +6445,7 @@
 		/* 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) {
+					== PURPLE_CONV_TYPE_IM) {
 			gboolean audio = purple_prpl_can_do_media(account,
 					purple_conversation_get_name(conv),
 					PURPLE_MEDIA_AUDIO);
@@ -7753,64 +7747,6 @@
 	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
-pidgin_gtkmedia_error_cb(PidginMedia *media, const char *msg, PurpleConversation *conv)
-{
-	purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, msg, PURPLE_MESSAGE_ERROR, time(NULL));
-}
-
-static void
-pidgin_conv_gtkmedia_destroyed(GtkWidget *widget, PidginConversation *gtkconv)
-{
-	gtk_widget_destroyed(widget, &(gtkconv->gtkmedia));
-	pidgin_conv_update_buttons_by_protocol(gtkconv->active_conv);
-}
-
-static gboolean
-pidgin_conv_new_media_cb(PurpleMediaManager *manager, PurpleMedia *media,
-		PurpleConnection *gc, gchar *screenname, gpointer nul)
-{
-	GtkWidget *gtkmedia;
-	PurpleConversation *conv;
-	PidginConversation *gtkconv;
-
-	conv = purple_conversation_new(PURPLE_CONV_TYPE_IM,
-			purple_connection_get_account(gc), screenname);
-
-	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, screenname);
-	g_object_unref(media);
-
-	gtk_box_pack_start(GTK_BOX(gtkconv->tophbox), gtkmedia, FALSE, FALSE, 0);
-	gtk_widget_show(gtkmedia);
-	g_signal_connect(G_OBJECT(gtkmedia), "message", G_CALLBACK(pidgin_gtkmedia_message_cb), conv);
-	g_signal_connect(G_OBJECT(gtkmedia), "error", G_CALLBACK(pidgin_gtkmedia_error_cb), conv);
-
-	gtkconv->gtkmedia = gtkmedia;
-	g_signal_connect(G_OBJECT(gtkmedia), "destroy", G_CALLBACK(
-			pidgin_conv_gtkmedia_destroyed), gtkconv);
-
-	pidgin_conv_update_buttons_by_protocol(conv);
-	return TRUE;
-}
-
-#endif
-
 void *
 pidgin_conversations_get_handle(void)
 {
@@ -7911,10 +7847,6 @@
 								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
 
 
 	/**********************************************************************
--- a/pidgin/gtkconv.h	Fri Jan 30 01:23:35 2009 +0000
+++ b/pidgin/gtkconv.h	Fri Jan 30 04:40:54 2009 +0000
@@ -169,8 +169,6 @@
 	GtkWidget *infopane;
 	GtkListStore *infopane_model;
 	GtkTreeIter infopane_iter;
-	GtkWidget *tophbox;
-	GtkWidget *gtkmedia;
 
 	/* Used when attaching a PidginConversation to a PurpleConversation
 	 * with message history */
--- a/pidgin/gtkmain.c	Fri Jan 30 01:23:35 2009 +0000
+++ b/pidgin/gtkmain.c	Fri Jan 30 04:40:54 2009 +0000
@@ -53,6 +53,7 @@
 #include "gtkft.h"
 #include "gtkidle.h"
 #include "gtklog.h"
+#include "gtkmedia.h"
 #include "gtknotify.h"
 #include "gtkplugin.h"
 #include "gtkpounce.h"
@@ -310,6 +311,7 @@
 	pidgin_log_init();
 	pidgin_docklet_init();
 	pidgin_smileys_init();
+	pidgin_medias_init();
 }
 
 static GHashTable *ui_info = NULL;
--- a/pidgin/gtkmedia.c	Fri Jan 30 01:23:35 2009 +0000
+++ b/pidgin/gtkmedia.c	Fri Jan 30 04:40:54 2009 +0000
@@ -28,6 +28,7 @@
 #include "internal.h"
 #include "connection.h"
 #include "media.h"
+#include "mediamanager.h"
 #include "pidgin.h"
 
 #include "gtkmedia.h"
@@ -71,6 +72,7 @@
 	GtkWidget *recv_widget;
 	GtkWidget *local_video;
 	GtkWidget *remote_video;
+	PurpleConnection *pc;
 };
 
 #define PIDGIN_MEDIA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), PIDGIN_TYPE_MEDIA, PidginMediaPrivate))
@@ -83,16 +85,15 @@
 static void pidgin_media_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
 static void pidgin_media_set_state(PidginMedia *gtkmedia, PidginMediaState state);
 
-static GtkHBoxClass *parent_class = NULL;
-
+static GtkWindowClass *parent_class = NULL;
 
 
+#if 0
 enum {
-	MESSAGE,
-	ERROR,
 	LAST_SIGNAL
 };
 static guint pidgin_media_signals[LAST_SIGNAL] = {0};
+#endif
 
 enum {
 	PROP_0,
@@ -120,7 +121,7 @@
 			(GInstanceInitFunc) pidgin_media_init,
 			NULL
 		};
-		type = g_type_register_static(GTK_TYPE_VBOX, "PidginMedia", &info, 0);
+		type = g_type_register_static(GTK_TYPE_WINDOW, "PidginMedia", &info, 0);
 	}
 	return type;
 }
@@ -163,15 +164,6 @@
 			GST_TYPE_ELEMENT,
 			G_PARAM_READWRITE));
 
-	pidgin_media_signals[MESSAGE] = g_signal_new("message", G_TYPE_FROM_CLASS(klass),
-					G_SIGNAL_RUN_LAST, 0, NULL, NULL,
-					g_cclosure_marshal_VOID__STRING,
-					G_TYPE_NONE, 1, G_TYPE_STRING);
-	pidgin_media_signals[ERROR] = g_signal_new("error", G_TYPE_FROM_CLASS(klass),
-					G_SIGNAL_RUN_LAST, 0, NULL, NULL,
-					g_cclosure_marshal_VOID__STRING,
-					G_TYPE_NONE, 1, G_TYPE_STRING);
-
 	g_type_class_add_private(klass, sizeof(PidginMediaPrivate));
 }
 
@@ -182,10 +174,24 @@
 			gtk_toggle_button_get_active(toggle));
 }
 
+static gboolean
+pidgin_media_delete_event_cb(GtkWidget *widget,
+		GdkEvent *event, PidginMedia *media)
+{
+	if (media->priv->media)
+		purple_media_hangup(media->priv->media);
+	return FALSE;
+}
+
 static void
 pidgin_media_init (PidginMedia *media)
 {
+	GtkWidget *vbox;
 	media->priv = PIDGIN_MEDIA_GET_PRIVATE(media);
+
+	vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
+	gtk_container_add(GTK_CONTAINER(media), vbox);
+
 	media->priv->calling = gtk_label_new("Calling...");
 	media->priv->hangup = gtk_button_new_with_mnemonic("_Hangup");
 	media->priv->accept = gtk_button_new_with_mnemonic("_Accept");
@@ -195,18 +201,24 @@
 	g_signal_connect(media->priv->mute, "toggled",
 			G_CALLBACK(pidgin_media_mute_toggled), media);
 
-	gtk_box_pack_end(GTK_BOX(media), media->priv->reject, FALSE, FALSE, 0);
-	gtk_box_pack_end(GTK_BOX(media), media->priv->accept, FALSE, FALSE, 0);
-	gtk_box_pack_end(GTK_BOX(media), media->priv->hangup, FALSE, FALSE, 0);
-	gtk_box_pack_end(GTK_BOX(media), media->priv->mute, FALSE, FALSE, 0);
-	gtk_box_pack_end(GTK_BOX(media), media->priv->calling, FALSE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(vbox), media->priv->reject, FALSE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(vbox), media->priv->accept, FALSE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(vbox), media->priv->hangup, FALSE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(vbox), media->priv->mute, FALSE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(vbox), media->priv->calling, FALSE, FALSE, 0);
 
 	gtk_widget_show_all(media->priv->accept);
 	gtk_widget_show_all(media->priv->reject);
 
 	media->priv->display = gtk_vbox_new(TRUE, PIDGIN_HIG_BOX_SPACE);
-	gtk_box_pack_start(GTK_BOX(media), media->priv->display,
+	gtk_box_pack_start(GTK_BOX(vbox), media->priv->display,
 			TRUE, TRUE, PIDGIN_HIG_BOX_SPACE);
+	gtk_widget_show(vbox);
+
+	g_signal_connect(G_OBJECT(media), "delete-event",
+			G_CALLBACK(pidgin_media_delete_event_cb), media);
+
+	gtk_widget_show(GTK_WIDGET(media));
 }
 
 static gboolean
@@ -315,7 +327,12 @@
 static void
 pidgin_media_emit_message(PidginMedia *gtkmedia, const char *msg)
 {
-	g_signal_emit(gtkmedia, pidgin_media_signals[MESSAGE], 0, msg);
+	PurpleConversation *conv = purple_find_conversation_with_account(
+			PURPLE_CONV_TYPE_ANY, gtkmedia->priv->screenname,
+			purple_connection_get_account(gtkmedia->priv->pc));
+	if (conv != NULL)
+		purple_conversation_write(conv, NULL, msg,
+				PURPLE_MESSAGE_SYSTEM, time(NULL));
 }
 
 typedef struct
@@ -354,7 +371,12 @@
 static void
 pidgin_media_error_cb(PidginMedia *media, const char *error, PidginMedia *gtkmedia)
 {
-	g_signal_emit(gtkmedia, pidgin_media_signals[ERROR], 0, error);
+	PurpleConversation *conv = purple_find_conversation_with_account(
+			PURPLE_CONV_TYPE_ANY, gtkmedia->priv->screenname,
+			purple_connection_get_account(gtkmedia->priv->pc));
+	if (conv != NULL)
+		purple_conversation_write(conv, NULL, error,
+				PURPLE_MESSAGE_ERROR, time(NULL));
 }
 
 static void
@@ -723,4 +745,22 @@
 	}
 }
 
+static gboolean
+pidgin_media_new_cb(PurpleMediaManager *manager, PurpleMedia *media,
+		PurpleConnection *pc, gchar *screenname, gpointer nul)
+{
+	PidginMedia *gtkmedia = PIDGIN_MEDIA(
+			pidgin_media_new(media, screenname));
+	gtkmedia->priv->pc = pc;
+
+	return TRUE;
+}
+
+void
+pidgin_medias_init(void)
+{
+	g_signal_connect(G_OBJECT(purple_media_manager_get()), "init-media",
+			 G_CALLBACK(pidgin_media_new_cb), NULL);
+}
+
 #endif  /* USE_VV */
--- a/pidgin/gtkmedia.h	Fri Jan 30 01:23:35 2009 +0000
+++ b/pidgin/gtkmedia.h	Fri Jan 30 04:40:54 2009 +0000
@@ -48,17 +48,19 @@
 
 struct _PidginMediaClass
 {
-	GtkHBoxClass parent_class;
+	GtkWindowClass parent_class;
 };
 
 struct _PidginMedia
 {
-	GtkHBox parent;
+	GtkWindow parent;
 	PidginMediaPrivate *priv;
 };
 
 GType pidgin_media_get_type(void);
 
+void pidgin_medias_init(void);
+
 GtkWidget *pidgin_media_new(PurpleMedia *media, const gchar *screenname);
 
 G_END_DECLS