# HG changeset patch # User Sadrul Habib Chowdhury # Date 1206177454 0 # Node ID befeece4dd488334df672f014aad1851b4255039 # Parent 10a76e4b0dc015a35e5cc7d944decffea9f8a73c 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? diff -r 10a76e4b0dc0 -r befeece4dd48 finch/gntmedia.c --- a/finch/gntmedia.c Sat Mar 22 05:10:29 2008 +0000 +++ b/finch/gntmedia.c Sat Mar 22 09:17:34 2008 +0000 @@ -401,7 +401,7 @@ if (!media) return PURPLE_CMD_STATUS_FAILED; - purple_media_accept(media); + purple_media_wait(media); return PURPLE_CMD_STATUS_OK; } diff -r 10a76e4b0dc0 -r befeece4dd48 libpurple/media.c --- a/libpurple/media.c Sat Mar 22 05:10:29 2008 +0000 +++ b/libpurple/media.c Sat Mar 22 09:17:34 2008 +0000 @@ -67,6 +67,7 @@ enum { READY, + WAIT, ACCEPTED, HANGUP, REJECT, @@ -189,6 +190,10 @@ G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + purple_media_signals[WAIT] = g_signal_new("wait", G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); purple_media_signals[ACCEPTED] = g_signal_new("accepted", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, @@ -441,6 +446,12 @@ } void +purple_media_wait(PurpleMedia *media) +{ + g_signal_emit(media, purple_media_signals[WAIT], 0); +} + +void purple_media_accept(PurpleMedia *media) { g_signal_emit(media, purple_media_signals[ACCEPTED], 0); diff -r 10a76e4b0dc0 -r befeece4dd48 libpurple/media.h --- a/libpurple/media.h Sat Mar 22 05:10:29 2008 +0000 +++ b/libpurple/media.h Sat Mar 22 09:17:34 2008 +0000 @@ -86,6 +86,7 @@ PurpleConnection *purple_media_get_connection(PurpleMedia *media); const char *purple_media_get_screenname(PurpleMedia *media); void purple_media_ready(PurpleMedia *media); +void purple_media_wait(PurpleMedia *media); void purple_media_accept(PurpleMedia *media); void purple_media_reject(PurpleMedia *media); void purple_media_hangup(PurpleMedia *media); diff -r 10a76e4b0dc0 -r befeece4dd48 libpurple/server.c --- a/libpurple/server.c Sat Mar 22 05:10:29 2008 +0000 +++ b/libpurple/server.c Sat Mar 22 09:17:34 2008 +0000 @@ -1050,12 +1050,12 @@ { PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - + if (gc) prpl = purple_connection_get_prpl(gc); if (prpl) prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); - + if (prpl_info && prpl_info->initiate_media) { /* should check that the protol supports this media type here.... */ return prpl_info->initiate_media(gc, who, type); diff -r 10a76e4b0dc0 -r befeece4dd48 pidgin/gtkconv.c --- a/pidgin/gtkconv.c Sat Mar 22 05:10:29 2008 +0000 +++ b/pidgin/gtkconv.c Sat Mar 22 09:17:34 2008 +0000 @@ -7629,43 +7629,22 @@ menu_initiate_voice_call_cb(gpointer data, guint action, GtkWidget *widget) { PidginWindow *win = (PidginWindow *)data; - GtkWidget *gtkmedia = NULL; PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); - PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv); - PurpleConnection *gc = purple_conversation_get_gc(conv); - PurplePluginProtocolInfo *prpl = gc->prpl; - PurpleMediaManager *manager = purple_media_manager_get(); PurpleMedia *media = serv_initiate_media(gc, purple_conversation_get_name(conv), PURPLE_MEDIA_RECV_AUDIO & PURPLE_MEDIA_SEND_AUDIO); - GstElement *sendbin, *src, *sendlevel; - GstElement *recvbin, *sink, *recvlevel; - GstPad *pad, *ghost; - - purple_media_audio_init_src(&sendbin, &sendlevel); - purple_media_audio_init_recv(&recvbin, &recvlevel); - - purple_media_set_audio_src(media, sendbin); - purple_media_set_audio_sink(media, recvbin); - - gtkmedia = pidgin_media_new(media, PIDGIN_MEDIA_WAITING, sendlevel, recvlevel); - - 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); - /* need to setup handler for accept, reject and if we hangup here... */ + + purple_media_wait(media); } static void pidgin_conv_new_media_cb(PurpleMediaManager *manager, PurpleMedia *media, gpointer nul) { - GstElement *sendbin, *src, *sendlevel; - GstElement *recvbin, *sink, *recvlevel; - GstPad *pad, *ghost; + GstElement *sendbin, *sendlevel; + GstElement *recvbin, *recvlevel; GtkWidget *gtkmedia; PurpleConversation *conv; @@ -7677,14 +7656,20 @@ purple_media_set_audio_src(media, sendbin); purple_media_set_audio_sink(media, recvbin); - gtkmedia = pidgin_media_new(media, PIDGIN_MEDIA_REQUESTED, sendlevel, recvlevel); conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, purple_connection_get_account(purple_media_get_connection(media)), purple_media_get_screenname(media)); gtkconv = PIDGIN_CONVERSATION(conv); + if (gtkconv->gtkmedia) + gtk_widget_destroy(gtkconv->gtkmedia); + + gtkmedia = pidgin_media_new(media, sendlevel, recvlevel); 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(gtk_widget_destroyed), &(gtkconv->gtkmedia)); } #endif diff -r 10a76e4b0dc0 -r befeece4dd48 pidgin/gtkconv.h --- a/pidgin/gtkconv.h Sat Mar 22 05:10:29 2008 +0000 +++ b/pidgin/gtkconv.h Sat Mar 22 09:17:34 2008 +0000 @@ -170,6 +170,7 @@ GtkListStore *infopane_model; GtkTreeIter infopane_iter; GtkWidget *topvbox; + GtkWidget *gtkmedia; /* Used when attaching a PidginConversation to a PurpleConversation * with message history */ diff -r 10a76e4b0dc0 -r befeece4dd48 pidgin/gtkmedia.c --- 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 +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; } diff -r 10a76e4b0dc0 -r befeece4dd48 pidgin/gtkmedia.h --- a/pidgin/gtkmedia.h Sat Mar 22 05:10:29 2008 +0000 +++ b/pidgin/gtkmedia.h Sat Mar 22 09:17:34 2008 +0000 @@ -46,7 +46,6 @@ typedef struct _PidginMedia PidginMedia; typedef struct _PidginMediaClass PidginMediaClass; typedef struct _PidginMediaPrivate PidginMediaPrivate; -typedef enum _PidginMediaState PidginMediaState; struct _PidginMediaClass { @@ -59,25 +58,9 @@ PidginMediaPrivate *priv; }; -enum _PidginMediaState -{ - /* Waiting for response */ - PIDGIN_MEDIA_WAITING = 1, - /* Got request */ - PIDGIN_MEDIA_REQUESTED, - /* Accepted call */ - PIDGIN_MEDIA_ACCEPTED, - /* Rejected call */ - PIDGIN_MEDIA_REJECTED, -}; - GType pidgin_media_get_type(void); -GtkWidget *pidgin_media_new(PurpleMedia *media, PidginMediaState state, - GstElement *send_level, GstElement *recv_level); -PidginMediaState pidgin_media_get_state(PidginMedia *gtkmedia); -void pidgin_media_set_state(PidginMedia *gtkmedia, PidginMediaState state); - +GtkWidget *pidgin_media_new(PurpleMedia *media, GstElement *send_level, GstElement *recv_level); G_END_DECLS