[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