Mercurial > pidgin.yaz
comparison 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 |
comparison
equal
deleted
inserted
replaced
26144:2091094745d9 | 26145:685c8f5f85c7 |
---|---|
26 #include <string.h> | 26 #include <string.h> |
27 #include "debug.h" | 27 #include "debug.h" |
28 #include "internal.h" | 28 #include "internal.h" |
29 #include "connection.h" | 29 #include "connection.h" |
30 #include "media.h" | 30 #include "media.h" |
31 #include "mediamanager.h" | |
31 #include "pidgin.h" | 32 #include "pidgin.h" |
32 | 33 |
33 #include "gtkmedia.h" | 34 #include "gtkmedia.h" |
34 | 35 |
35 #ifdef USE_VV | 36 #ifdef USE_VV |
69 GtkWidget *display; | 70 GtkWidget *display; |
70 GtkWidget *send_widget; | 71 GtkWidget *send_widget; |
71 GtkWidget *recv_widget; | 72 GtkWidget *recv_widget; |
72 GtkWidget *local_video; | 73 GtkWidget *local_video; |
73 GtkWidget *remote_video; | 74 GtkWidget *remote_video; |
75 PurpleConnection *pc; | |
74 }; | 76 }; |
75 | 77 |
76 #define PIDGIN_MEDIA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), PIDGIN_TYPE_MEDIA, PidginMediaPrivate)) | 78 #define PIDGIN_MEDIA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), PIDGIN_TYPE_MEDIA, PidginMediaPrivate)) |
77 | 79 |
78 static void pidgin_media_class_init (PidginMediaClass *klass); | 80 static void pidgin_media_class_init (PidginMediaClass *klass); |
81 static void pidgin_media_finalize (GObject *object); | 83 static void pidgin_media_finalize (GObject *object); |
82 static void pidgin_media_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); | 84 static void pidgin_media_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); |
83 static void pidgin_media_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); | 85 static void pidgin_media_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); |
84 static void pidgin_media_set_state(PidginMedia *gtkmedia, PidginMediaState state); | 86 static void pidgin_media_set_state(PidginMedia *gtkmedia, PidginMediaState state); |
85 | 87 |
86 static GtkHBoxClass *parent_class = NULL; | 88 static GtkWindowClass *parent_class = NULL; |
87 | 89 |
88 | 90 |
89 | 91 #if 0 |
90 enum { | 92 enum { |
91 MESSAGE, | |
92 ERROR, | |
93 LAST_SIGNAL | 93 LAST_SIGNAL |
94 }; | 94 }; |
95 static guint pidgin_media_signals[LAST_SIGNAL] = {0}; | 95 static guint pidgin_media_signals[LAST_SIGNAL] = {0}; |
96 #endif | |
96 | 97 |
97 enum { | 98 enum { |
98 PROP_0, | 99 PROP_0, |
99 PROP_MEDIA, | 100 PROP_MEDIA, |
100 PROP_SCREENNAME, | 101 PROP_SCREENNAME, |
118 sizeof(PidginMedia), | 119 sizeof(PidginMedia), |
119 0, | 120 0, |
120 (GInstanceInitFunc) pidgin_media_init, | 121 (GInstanceInitFunc) pidgin_media_init, |
121 NULL | 122 NULL |
122 }; | 123 }; |
123 type = g_type_register_static(GTK_TYPE_VBOX, "PidginMedia", &info, 0); | 124 type = g_type_register_static(GTK_TYPE_WINDOW, "PidginMedia", &info, 0); |
124 } | 125 } |
125 return type; | 126 return type; |
126 } | 127 } |
127 | 128 |
128 | 129 |
161 "Receive level", | 162 "Receive level", |
162 "The GstElement of this media's recv 'level'", | 163 "The GstElement of this media's recv 'level'", |
163 GST_TYPE_ELEMENT, | 164 GST_TYPE_ELEMENT, |
164 G_PARAM_READWRITE)); | 165 G_PARAM_READWRITE)); |
165 | 166 |
166 pidgin_media_signals[MESSAGE] = g_signal_new("message", G_TYPE_FROM_CLASS(klass), | |
167 G_SIGNAL_RUN_LAST, 0, NULL, NULL, | |
168 g_cclosure_marshal_VOID__STRING, | |
169 G_TYPE_NONE, 1, G_TYPE_STRING); | |
170 pidgin_media_signals[ERROR] = g_signal_new("error", G_TYPE_FROM_CLASS(klass), | |
171 G_SIGNAL_RUN_LAST, 0, NULL, NULL, | |
172 g_cclosure_marshal_VOID__STRING, | |
173 G_TYPE_NONE, 1, G_TYPE_STRING); | |
174 | |
175 g_type_class_add_private(klass, sizeof(PidginMediaPrivate)); | 167 g_type_class_add_private(klass, sizeof(PidginMediaPrivate)); |
176 } | 168 } |
177 | 169 |
178 static void | 170 static void |
179 pidgin_media_mute_toggled(GtkToggleButton *toggle, PidginMedia *media) | 171 pidgin_media_mute_toggled(GtkToggleButton *toggle, PidginMedia *media) |
180 { | 172 { |
181 purple_media_mute(media->priv->media, | 173 purple_media_mute(media->priv->media, |
182 gtk_toggle_button_get_active(toggle)); | 174 gtk_toggle_button_get_active(toggle)); |
183 } | 175 } |
184 | 176 |
177 static gboolean | |
178 pidgin_media_delete_event_cb(GtkWidget *widget, | |
179 GdkEvent *event, PidginMedia *media) | |
180 { | |
181 if (media->priv->media) | |
182 purple_media_hangup(media->priv->media); | |
183 return FALSE; | |
184 } | |
185 | |
185 static void | 186 static void |
186 pidgin_media_init (PidginMedia *media) | 187 pidgin_media_init (PidginMedia *media) |
187 { | 188 { |
189 GtkWidget *vbox; | |
188 media->priv = PIDGIN_MEDIA_GET_PRIVATE(media); | 190 media->priv = PIDGIN_MEDIA_GET_PRIVATE(media); |
191 | |
192 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); | |
193 gtk_container_add(GTK_CONTAINER(media), vbox); | |
194 | |
189 media->priv->calling = gtk_label_new("Calling..."); | 195 media->priv->calling = gtk_label_new("Calling..."); |
190 media->priv->hangup = gtk_button_new_with_mnemonic("_Hangup"); | 196 media->priv->hangup = gtk_button_new_with_mnemonic("_Hangup"); |
191 media->priv->accept = gtk_button_new_with_mnemonic("_Accept"); | 197 media->priv->accept = gtk_button_new_with_mnemonic("_Accept"); |
192 media->priv->reject = gtk_button_new_with_mnemonic("_Reject"); | 198 media->priv->reject = gtk_button_new_with_mnemonic("_Reject"); |
193 media->priv->mute = gtk_toggle_button_new_with_mnemonic("_Mute"); | 199 media->priv->mute = gtk_toggle_button_new_with_mnemonic("_Mute"); |
194 | 200 |
195 g_signal_connect(media->priv->mute, "toggled", | 201 g_signal_connect(media->priv->mute, "toggled", |
196 G_CALLBACK(pidgin_media_mute_toggled), media); | 202 G_CALLBACK(pidgin_media_mute_toggled), media); |
197 | 203 |
198 gtk_box_pack_end(GTK_BOX(media), media->priv->reject, FALSE, FALSE, 0); | 204 gtk_box_pack_end(GTK_BOX(vbox), media->priv->reject, FALSE, FALSE, 0); |
199 gtk_box_pack_end(GTK_BOX(media), media->priv->accept, FALSE, FALSE, 0); | 205 gtk_box_pack_end(GTK_BOX(vbox), media->priv->accept, FALSE, FALSE, 0); |
200 gtk_box_pack_end(GTK_BOX(media), media->priv->hangup, FALSE, FALSE, 0); | 206 gtk_box_pack_end(GTK_BOX(vbox), media->priv->hangup, FALSE, FALSE, 0); |
201 gtk_box_pack_end(GTK_BOX(media), media->priv->mute, FALSE, FALSE, 0); | 207 gtk_box_pack_end(GTK_BOX(vbox), media->priv->mute, FALSE, FALSE, 0); |
202 gtk_box_pack_end(GTK_BOX(media), media->priv->calling, FALSE, FALSE, 0); | 208 gtk_box_pack_end(GTK_BOX(vbox), media->priv->calling, FALSE, FALSE, 0); |
203 | 209 |
204 gtk_widget_show_all(media->priv->accept); | 210 gtk_widget_show_all(media->priv->accept); |
205 gtk_widget_show_all(media->priv->reject); | 211 gtk_widget_show_all(media->priv->reject); |
206 | 212 |
207 media->priv->display = gtk_vbox_new(TRUE, PIDGIN_HIG_BOX_SPACE); | 213 media->priv->display = gtk_vbox_new(TRUE, PIDGIN_HIG_BOX_SPACE); |
208 gtk_box_pack_start(GTK_BOX(media), media->priv->display, | 214 gtk_box_pack_start(GTK_BOX(vbox), media->priv->display, |
209 TRUE, TRUE, PIDGIN_HIG_BOX_SPACE); | 215 TRUE, TRUE, PIDGIN_HIG_BOX_SPACE); |
216 gtk_widget_show(vbox); | |
217 | |
218 g_signal_connect(G_OBJECT(media), "delete-event", | |
219 G_CALLBACK(pidgin_media_delete_event_cb), media); | |
220 | |
221 gtk_widget_show(GTK_WIDGET(media)); | |
210 } | 222 } |
211 | 223 |
212 static gboolean | 224 static gboolean |
213 level_message_cb(GstBus *bus, GstMessage *message, PidginMedia *gtkmedia) | 225 level_message_cb(GstBus *bus, GstMessage *message, PidginMedia *gtkmedia) |
214 { | 226 { |
313 } | 325 } |
314 | 326 |
315 static void | 327 static void |
316 pidgin_media_emit_message(PidginMedia *gtkmedia, const char *msg) | 328 pidgin_media_emit_message(PidginMedia *gtkmedia, const char *msg) |
317 { | 329 { |
318 g_signal_emit(gtkmedia, pidgin_media_signals[MESSAGE], 0, msg); | 330 PurpleConversation *conv = purple_find_conversation_with_account( |
331 PURPLE_CONV_TYPE_ANY, gtkmedia->priv->screenname, | |
332 purple_connection_get_account(gtkmedia->priv->pc)); | |
333 if (conv != NULL) | |
334 purple_conversation_write(conv, NULL, msg, | |
335 PURPLE_MESSAGE_SYSTEM, time(NULL)); | |
319 } | 336 } |
320 | 337 |
321 typedef struct | 338 typedef struct |
322 { | 339 { |
323 PidginMedia *gtkmedia; | 340 PidginMedia *gtkmedia; |
352 } | 369 } |
353 | 370 |
354 static void | 371 static void |
355 pidgin_media_error_cb(PidginMedia *media, const char *error, PidginMedia *gtkmedia) | 372 pidgin_media_error_cb(PidginMedia *media, const char *error, PidginMedia *gtkmedia) |
356 { | 373 { |
357 g_signal_emit(gtkmedia, pidgin_media_signals[ERROR], 0, error); | 374 PurpleConversation *conv = purple_find_conversation_with_account( |
375 PURPLE_CONV_TYPE_ANY, gtkmedia->priv->screenname, | |
376 purple_connection_get_account(gtkmedia->priv->pc)); | |
377 if (conv != NULL) | |
378 purple_conversation_write(conv, NULL, error, | |
379 PURPLE_MESSAGE_ERROR, time(NULL)); | |
358 } | 380 } |
359 | 381 |
360 static void | 382 static void |
361 pidgin_media_accepted_cb(PurpleMedia *media, const gchar *session_id, | 383 pidgin_media_accepted_cb(PurpleMedia *media, const gchar *session_id, |
362 const gchar *participant, PidginMedia *gtkmedia) | 384 const gchar *participant, PidginMedia *gtkmedia) |
721 default: | 743 default: |
722 break; | 744 break; |
723 } | 745 } |
724 } | 746 } |
725 | 747 |
748 static gboolean | |
749 pidgin_media_new_cb(PurpleMediaManager *manager, PurpleMedia *media, | |
750 PurpleConnection *pc, gchar *screenname, gpointer nul) | |
751 { | |
752 PidginMedia *gtkmedia = PIDGIN_MEDIA( | |
753 pidgin_media_new(media, screenname)); | |
754 gtkmedia->priv->pc = pc; | |
755 | |
756 return TRUE; | |
757 } | |
758 | |
759 void | |
760 pidgin_medias_init(void) | |
761 { | |
762 g_signal_connect(G_OBJECT(purple_media_manager_get()), "init-media", | |
763 G_CALLBACK(pidgin_media_new_cb), NULL); | |
764 } | |
765 | |
726 #endif /* USE_VV */ | 766 #endif /* USE_VV */ |