[telepathy-mission-control/master] McdClientRegistry: signal when clients are added
Simon McVittie
simon.mcvittie at collabora.co.uk
Mon Oct 19 07:01:07 PDT 2009
---
src/client-registry.c | 18 +++++++++++++++
src/mcd-dispatcher.c | 56 +++++++++++++++++++++++++++++-------------------
2 files changed, 52 insertions(+), 22 deletions(-)
diff --git a/src/client-registry.c b/src/client-registry.c
index 673fe11..c0e807b 100644
--- a/src/client-registry.c
+++ b/src/client-registry.c
@@ -31,6 +31,14 @@ enum
PROP_DBUS_DAEMON
};
+enum
+{
+ S_CLIENT_ADDED,
+ N_SIGNALS
+};
+
+static guint signals[N_SIGNALS] = { 0 };
+
struct _McdClientRegistryPrivate
{
/* hash table containing clients
@@ -61,6 +69,9 @@ _mcd_client_registry_add_new (McdClientRegistry *self,
activatable);
g_hash_table_insert (self->priv->clients, g_strdup (well_known_name),
client);
+
+ g_signal_emit (self, signals[S_CLIENT_ADDED], 0, client);
+
return client;
}
@@ -207,6 +218,13 @@ _mcd_client_registry_class_init (McdClientRegistryClass *cls)
g_param_spec_object ("dbus-daemon", "D-Bus daemon", "D-Bus daemon",
TP_TYPE_DBUS_DAEMON,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+ signals[S_CLIENT_ADDED] = g_signal_new ("client-added",
+ G_OBJECT_CLASS_TYPE (cls),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0, NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, MCD_TYPE_CLIENT_PROXY);
}
McdClientRegistry *
diff --git a/src/mcd-dispatcher.c b/src/mcd-dispatcher.c
index 91fbb0a..34ec253 100644
--- a/src/mcd-dispatcher.c
+++ b/src/mcd-dispatcher.c
@@ -1770,6 +1770,33 @@ mcd_dispatcher_client_gone_cb (McdClientProxy *client,
}
static void
+mcd_dispatcher_client_added_cb (McdClientRegistry *clients G_GNUC_UNUSED,
+ McdClientProxy *client,
+ McdDispatcher *self)
+{
+ /* paired with one in mcd_dispatcher_client_ready_cb, when the
+ * McdClientProxy is ready */
+ if (!self->priv->startup_completed)
+ self->priv->startup_lock++;
+
+ g_signal_connect (client, "ready",
+ G_CALLBACK (mcd_dispatcher_client_ready_cb),
+ self);
+
+ g_signal_connect (client, "gone",
+ G_CALLBACK (mcd_dispatcher_client_gone_cb),
+ self);
+
+ g_signal_connect (client, "is-handling-channel",
+ G_CALLBACK (mcd_dispatcher_client_handling_channel_cb),
+ self);
+
+ g_signal_connect (client, "handler-capabilities-changed",
+ G_CALLBACK (mcd_dispatcher_client_capabilities_changed_cb),
+ self);
+}
+
+static void
_mcd_dispatcher_dispose (GObject * object)
{
McdDispatcherPrivate *priv = MCD_DISPATCHER_PRIV (object);
@@ -1798,6 +1825,10 @@ _mcd_dispatcher_dispose (GObject * object)
mcd_dispatcher_discard_client ((McdDispatcher *) object, client_p);
}
+ g_signal_handlers_disconnect_by_func (priv->clients,
+ mcd_dispatcher_client_added_cb,
+ object);
+
g_object_unref (priv->clients);
priv->clients = NULL;
}
@@ -1904,7 +1935,7 @@ mcd_dispatcher_client_ready_cb (McdClientProxy *client,
mcd_dispatcher_client_ready_cb,
dispatcher);
- /* paired with the one in mcd_dispatcher_add_client */
+ /* paired with the one in mcd_dispatcher_client_added_cb */
mcd_dispatcher_release_startup_lock (dispatcher);
}
@@ -1957,29 +1988,8 @@ mcd_dispatcher_add_client (McdDispatcher *self,
DEBUG ("Register client %s", name);
- /* paired with one in mcd_dispatcher_client_ready_cb, when the
- * McdClientProxy is ready */
- if (!self->priv->startup_completed)
- self->priv->startup_lock++;
-
client = _mcd_client_registry_add_new (self->priv->clients,
name, owner, activatable);
-
- g_signal_connect (client, "ready",
- G_CALLBACK (mcd_dispatcher_client_ready_cb),
- self);
-
- g_signal_connect (client, "gone",
- G_CALLBACK (mcd_dispatcher_client_gone_cb),
- self);
-
- g_signal_connect (client, "is-handling-channel",
- G_CALLBACK (mcd_dispatcher_client_handling_channel_cb),
- self);
-
- g_signal_connect (client, "handler-capabilities-changed",
- G_CALLBACK (mcd_dispatcher_client_capabilities_changed_cb),
- self);
}
static void
@@ -2126,6 +2136,8 @@ mcd_dispatcher_constructed (GObject *object)
GError *error = NULL;
priv->clients = _mcd_client_registry_new (priv->dbus_daemon);
+ g_signal_connect (priv->clients, "client-added",
+ G_CALLBACK (mcd_dispatcher_client_added_cb), object);
DEBUG ("Starting to look for clients");
priv->startup_completed = FALSE;
--
1.5.6.5
More information about the telepathy-commits
mailing list