diff pidgin/gtkmedia.c @ 25643:befeece4dd48

Change a few things: * call purple_media_wait to notify that we are waiting on a response from the remote end * fix the /call command in finch * keep track of the PidginMedia for a PidginConversation * fix the two-widget bug in pidgin. We probably should have a way to get the PidginMedia from a PurpleMedia. Should we use _set/_get_ui_data for this?
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 22 Mar 2008 09:17:34 +0000
parents 92e71f6e10d4
children e1c8ec1259de
line wrap: on
line diff
--- a/pidgin/gtkmedia.c	Sat Mar 22 05:10:29 2008 +0000
+++ b/pidgin/gtkmedia.c	Sat Mar 22 09:17:34 2008 +0000
@@ -34,6 +34,18 @@
 
 #include <farsight/farsight.h>
 
+typedef enum
+{
+	/* Waiting for response */
+	PIDGIN_MEDIA_WAITING = 1,
+	/* Got request */
+	PIDGIN_MEDIA_REQUESTED,
+	/* Accepted call */
+	PIDGIN_MEDIA_ACCEPTED,
+	/* Rejected call */
+	PIDGIN_MEDIA_REJECTED,
+} PidginMediaState;
+
 struct _PidginMediaPrivate
 {
 	PurpleMedia *media;
@@ -58,6 +70,7 @@
 static void pidgin_media_finalize (GObject *object);
 static void pidgin_media_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
 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;
 
@@ -164,15 +177,20 @@
 	gtk_widget_show(media->priv->send_progress);
 	gtk_widget_show(media->priv->recv_progress);
 
-	/*
-	   gtk_widget_show_all(media->priv->accept);
-	   gtk_widget_show_all(media->priv->reject);
-	   */
+	gtk_widget_show_all(media->priv->accept);
+	gtk_widget_show_all(media->priv->reject);
 }
 
 static void
 pidgin_media_finalize (GObject *media)
 {
+	PidginMedia *gtkmedia = PIDGIN_MEDIA(media);
+	if (gtkmedia->priv->media)
+		g_object_unref(gtkmedia->priv->media);
+	if (gtkmedia->priv->send_level)
+		gst_object_unref(gtkmedia->priv->send_level);
+	if (gtkmedia->priv->recv_level)
+		gst_object_unref(gtkmedia->priv->recv_level);
 }
 
 static void
@@ -227,6 +245,12 @@
 	printf("\n\nbus: %p\n", gst_pipeline_get_bus(GST_PIPELINE(element)));
 }
 
+static void
+pidgin_media_wait_cb(PurpleMedia *media, PidginMedia *gtkmedia)
+{
+	pidgin_media_set_state(gtkmedia, PIDGIN_MEDIA_WAITING);
+}
+
 /* maybe we should have different callbacks for when we received the accept
     and we accepted ourselves */
 static void
@@ -281,6 +305,8 @@
 				G_CALLBACK(pidgin_media_accept_cb), media);
 			g_signal_connect(G_OBJECT(media->priv->media) ,"ready",
 				G_CALLBACK(pidgin_media_ready_cb), media);
+			g_signal_connect(G_OBJECT(media->priv->media) ,"wait",
+				G_CALLBACK(pidgin_media_wait_cb), media);
 			g_signal_connect(G_OBJECT(media->priv->media), "hangup",
 				G_CALLBACK(pidgin_media_hangup_cb), media);
 			g_signal_connect(G_OBJECT(media->priv->media), "reject",
@@ -333,17 +359,15 @@
 }
 
 GtkWidget *
-pidgin_media_new(PurpleMedia *media, PidginMediaState state,
-                 GstElement *sendlevel, GstElement *recvlevel)
+pidgin_media_new(PurpleMedia *media, GstElement *sendlevel, GstElement *recvlevel)
 {
 	PidginMedia *gtkmedia = g_object_new(pidgin_media_get_type(), "media", media,
 			"send-level", sendlevel,
 			"recv-level", recvlevel, NULL);
-	pidgin_media_set_state(gtkmedia, state);
 	return GTK_WIDGET(gtkmedia);
 }
 
-void
+static void
 pidgin_media_set_state(PidginMedia *gtkmedia, PidginMediaState state)
 {
 	gtkmedia->priv->state = state;
@@ -352,12 +376,12 @@
 			gtk_widget_show(gtkmedia->priv->calling);
 			gtk_widget_hide(gtkmedia->priv->accept);
 			gtk_widget_hide(gtkmedia->priv->reject);
-			gtk_widget_hide(gtkmedia->priv->hangup);
+			gtk_widget_show(gtkmedia->priv->hangup);
 			break;
 		case PIDGIN_MEDIA_REQUESTED:
+			gtk_widget_hide(gtkmedia->priv->calling);
 			gtk_widget_show(gtkmedia->priv->accept);
 			gtk_widget_show(gtkmedia->priv->reject);
-			gtk_widget_hide(gtkmedia->priv->calling);
 			gtk_widget_hide(gtkmedia->priv->hangup);
 			break;
 		case PIDGIN_MEDIA_ACCEPTED:
@@ -366,12 +390,6 @@
 			gtk_widget_hide(gtkmedia->priv->accept);
 			gtk_widget_hide(gtkmedia->priv->reject);
 			break;
-		case PIDGIN_MEDIA_REJECTED:
-			gtk_widget_hide(gtkmedia->priv->calling);
-			gtk_widget_hide(gtkmedia->priv->hangup);
-			gtk_widget_hide(gtkmedia->priv->accept);
-			gtk_widget_hide(gtkmedia->priv->reject);
-			break;
 		default:
 			break;
 	}