[telepathy-mission-control/master] McdClientProxy: emit "gone" signal when neither activatable nor active

Simon McVittie simon.mcvittie at collabora.co.uk
Mon Oct 19 07:01:06 PDT 2009


---
 src/mcd-client.c     |   10 ++++++++++
 src/mcd-dispatcher.c |   25 +++++++++++++++++++------
 2 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/src/mcd-client.c b/src/mcd-client.c
index 7bd0b86..defdac6 100644
--- a/src/mcd-client.c
+++ b/src/mcd-client.c
@@ -53,6 +53,7 @@ enum
     S_READY,
     S_IS_HANDLING_CHANNEL,
     S_HANDLER_CAPABILITIES_CHANGED,
+    S_GONE,
     N_SIGNALS
 };
 
@@ -1014,6 +1015,13 @@ _mcd_client_proxy_class_init (McdClientProxyClass *klass)
         g_cclosure_marshal_VOID__VOID,
         G_TYPE_NONE, 0);
 
+    signals[S_GONE] = g_signal_new ("gone",
+        G_OBJECT_CLASS_TYPE (klass),
+        G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+        0, NULL, NULL,
+        g_cclosure_marshal_VOID__VOID,
+        G_TYPE_NONE, 0);
+
     /* Never emitted until after the unique name is known */
     signals[S_IS_HANDLING_CHANNEL] = g_signal_new ("is-handling-channel",
         G_OBJECT_CLASS_TYPE (klass),
@@ -1169,6 +1177,8 @@ _mcd_client_proxy_set_inactive (McdClientProxy *self)
          * of a client by giving it an empty set of capabilities and
          * filters */
         _mcd_client_proxy_become_incapable (self);
+
+        g_signal_emit (self, signals[S_GONE], 0);
     }
 }
 
diff --git a/src/mcd-dispatcher.c b/src/mcd-dispatcher.c
index 6987e0f..c379c8c 100644
--- a/src/mcd-dispatcher.c
+++ b/src/mcd-dispatcher.c
@@ -1729,6 +1729,8 @@ mcd_dispatcher_client_capabilities_changed_cb (McdClientProxy *client,
 
 static void mcd_dispatcher_client_ready_cb (McdClientProxy *client,
                                             McdDispatcher *dispatcher);
+static void mcd_dispatcher_client_gone_cb (McdClientProxy *client,
+                                           McdDispatcher *self);
 
 static void
 mcd_dispatcher_discard_client (McdDispatcher *self,
@@ -1744,6 +1746,10 @@ mcd_dispatcher_discard_client (McdDispatcher *self,
                                           mcd_dispatcher_client_ready_cb,
                                           self);
 
+    g_signal_handlers_disconnect_by_func (client,
+                                          mcd_dispatcher_client_gone_cb,
+                                          self);
+
     if (!_mcd_client_proxy_is_ready (client))
     {
         /* we'll never receive the ready signal now, so release the lock that
@@ -1755,6 +1761,15 @@ mcd_dispatcher_discard_client (McdDispatcher *self,
 }
 
 static void
+mcd_dispatcher_client_gone_cb (McdClientProxy *client,
+                               McdDispatcher *self)
+{
+    mcd_dispatcher_discard_client (self, client);
+    _mcd_client_registry_remove (self->priv->clients,
+                                 tp_proxy_get_bus_name (client));
+}
+
+static void
 _mcd_dispatcher_dispose (GObject * object)
 {
     McdDispatcherPrivate *priv = MCD_DISPATCHER_PRIV (object);
@@ -1954,6 +1969,10 @@ mcd_dispatcher_add_client (McdDispatcher *self,
                       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);
@@ -2084,12 +2103,6 @@ name_owner_changed_cb (TpDBusDaemon *proxy,
         if (client)
         {
             _mcd_client_proxy_set_inactive (client);
-
-            if (!_mcd_client_proxy_is_activatable (client))
-            {
-                mcd_dispatcher_discard_client (self, client);
-                _mcd_client_registry_remove (priv->clients, name);
-            }
         }
 
         if (name[0] == ':')
-- 
1.5.6.5




More information about the telepathy-commits mailing list