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 */