diff pidgin/gtkmedia.c @ 26145:685c8f5f85c7

Separate PidginMedia from PidginConversation.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Fri, 30 Jan 2009 04:40:54 +0000
parents f6a98b2b8d92
children 4f013819e4e3
line wrap: on
line diff
--- 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 */