[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