summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Adam <jakub.adam@ktknet.cz>2016-06-23 12:57:41 +0200
committerJakub Adam <jakub.adam@ktknet.cz>2016-06-23 12:57:41 +0200
commit62763c0dfe26c20d93d762c4b674ce159fb5aeaf (patch)
treebdfbc109748de007c65bceb5acd7ea61e5629e01
parent757f7048c1e5798e3bc8baf544c83ebfec835a9b (diff)
downloadpidgin-62763c0dfe26c20d93d762c4b674ce159fb5aeaf.tar.gz
mediamanager: add "elements-changed" signal
-rw-r--r--libpurple/mediamanager.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c
index 07553e8d88..49bb9dc5e2 100644
--- a/libpurple/mediamanager.c
+++ b/libpurple/mediamanager.c
@@ -161,6 +161,7 @@ enum {
INIT_MEDIA,
INIT_PRIVATE_MEDIA,
UI_CAPS_CHANGED,
+ ELEMENTS_CHANGED,
LAST_SIGNAL
};
static guint purple_media_manager_signals[LAST_SIGNAL] = {0};
@@ -227,6 +228,14 @@ purple_media_manager_class_init (PurpleMediaManagerClass *klass)
G_TYPE_NONE, 2, PURPLE_MEDIA_TYPE_CAPS,
PURPLE_MEDIA_TYPE_CAPS);
+ purple_media_manager_signals[ELEMENTS_CHANGED] =
+ g_signal_new("elements-changed",
+ G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0, NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
g_type_class_add_private(klass, sizeof(PurpleMediaManagerPrivate));
}
@@ -1316,6 +1325,30 @@ purple_media_manager_get_element_info(PurpleMediaManager *manager,
return NULL;
}
+static GQuark
+element_info_to_detail(PurpleMediaElementInfo *info)
+{
+ PurpleMediaElementType type;
+
+ type = purple_media_element_info_get_element_type(info);
+
+ if (type & PURPLE_MEDIA_ELEMENT_AUDIO) {
+ if (type & PURPLE_MEDIA_ELEMENT_SRC) {
+ return g_quark_from_string("audiosrc");
+ } else if (type & PURPLE_MEDIA_ELEMENT_SINK) {
+ return g_quark_from_string("audiosink");
+ }
+ } else if (type & PURPLE_MEDIA_ELEMENT_VIDEO) {
+ if (type & PURPLE_MEDIA_ELEMENT_SRC) {
+ return g_quark_from_string("videosrc");
+ } else if (type & PURPLE_MEDIA_ELEMENT_SINK) {
+ return g_quark_from_string("videosink");
+ }
+ }
+
+ return 0;
+}
+
gboolean
purple_media_manager_register_element(PurpleMediaManager *manager,
PurpleMediaElementInfo *info)
@@ -1323,6 +1356,7 @@ purple_media_manager_register_element(PurpleMediaManager *manager,
#ifdef USE_VV
PurpleMediaElementInfo *info2;
gchar *id;
+ GQuark detail;
g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE);
g_return_val_if_fail(info != NULL, FALSE);
@@ -1338,6 +1372,14 @@ purple_media_manager_register_element(PurpleMediaManager *manager,
manager->priv->elements =
g_list_prepend(manager->priv->elements, info);
+
+ detail = element_info_to_detail(info);
+ if (detail != 0) {
+ g_signal_emit(manager,
+ purple_media_manager_signals[ELEMENTS_CHANGED],
+ detail);
+ }
+
return TRUE;
#else
return FALSE;
@@ -1350,6 +1392,7 @@ purple_media_manager_unregister_element(PurpleMediaManager *manager,
{
#ifdef USE_VV
PurpleMediaElementInfo *info;
+ GQuark detail;
g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE);
@@ -1369,9 +1412,18 @@ purple_media_manager_unregister_element(PurpleMediaManager *manager,
if (manager->priv->video_sink == info)
manager->priv->video_sink = NULL;
+ detail = element_info_to_detail(info);
+
manager->priv->elements = g_list_remove(
manager->priv->elements, info);
g_object_unref(info);
+
+ if (detail != 0) {
+ g_signal_emit(manager,
+ purple_media_manager_signals[ELEMENTS_CHANGED],
+ detail);
+ }
+
return TRUE;
#else
return FALSE;