diff options
author | Ken VanDine <ken.vandine@canonical.com> | 2010-02-08 19:25:26 -0500 |
---|---|---|
committer | Ken VanDine <ken.vandine@canonical.com> | 2010-02-08 19:25:26 -0500 |
commit | c9d339ff50253e87e51045acf896a9663f582144 (patch) | |
tree | 271e25a59d2dd89b1dc8f1bc95329e3ce0468d5e /src/libappindicator/app-indicator.c | |
parent | b8830e1f10bffec7b3bcdacef125b4cbf5472d01 (diff) | |
parent | b881da97404a6e1dbecbfb112d2cb1c7f436ab20 (diff) | |
download | ayatana-indicator-application-c9d339ff50253e87e51045acf896a9663f582144.tar.gz ayatana-indicator-application-c9d339ff50253e87e51045acf896a9663f582144.tar.bz2 ayatana-indicator-application-c9d339ff50253e87e51045acf896a9663f582144.zip |
releasing version 0.0.12-0ubuntu10.0.12-0ubuntu1
Diffstat (limited to 'src/libappindicator/app-indicator.c')
-rw-r--r-- | src/libappindicator/app-indicator.c | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/src/libappindicator/app-indicator.c b/src/libappindicator/app-indicator.c index 908684f..426ee8c 100644 --- a/src/libappindicator/app-indicator.c +++ b/src/libappindicator/app-indicator.c @@ -330,6 +330,7 @@ app_indicator_init (AppIndicator *self) g_error_free(error); return; } + dbus_g_connection_ref(priv->connection); dbus_g_connection_register_g_object(priv->connection, DEFAULT_ITEM_PATH, @@ -386,6 +387,11 @@ app_indicator_dispose (GObject *object) priv->watcher_proxy = NULL; } + if (priv->connection != NULL) { + dbus_g_connection_unref(priv->connection); + priv->connection = NULL; + } + G_OBJECT_CLASS (app_indicator_parent_class)->dispose (object); return; } @@ -684,6 +690,33 @@ dbus_owner_change (DBusGProxy * proxy, const gchar * name, const gchar * prev, c return; } +/* This is an idle function to create the proxy. This is mostly + because start_fallback_timer can get called in the distruction + of a proxy and thus the proxy manager gets confused when creating + a new proxy as part of destroying an old one. This function being + on idle means that we'll just do it outside of the same stack where + the previous proxy is being destroyed. */ +static gboolean +setup_name_owner_proxy (gpointer data) +{ + g_return_val_if_fail(IS_APP_INDICATOR(data), FALSE); + AppIndicatorPrivate * priv = APP_INDICATOR(data)->priv; + + if (priv->dbus_proxy == NULL) { + priv->dbus_proxy = dbus_g_proxy_new_for_name(priv->connection, + DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, + DBUS_INTERFACE_DBUS); + dbus_g_proxy_add_signal(priv->dbus_proxy, "NameOwnerChanged", + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_INVALID); + dbus_g_proxy_connect_signal(priv->dbus_proxy, "NameOwnerChanged", + G_CALLBACK(dbus_owner_change), data, NULL); + } + + return FALSE; +} + /* A function that will start the fallback timer if it's not already started. It sets up the DBus watcher to see if there is a change. Also, provides an override mode for cases @@ -701,15 +734,8 @@ start_fallback_timer (AppIndicator * self, gboolean disable_timeout) } if (priv->dbus_proxy == NULL) { - priv->dbus_proxy = dbus_g_proxy_new_for_name(priv->connection, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS); - dbus_g_proxy_add_signal(priv->dbus_proxy, "NameOwnerChanged", - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal(priv->dbus_proxy, "NameOwnerChanged", - G_CALLBACK(dbus_owner_change), self, NULL); + /* NOTE: Read the comment on setup_name_owner_proxy */ + g_idle_add(setup_name_owner_proxy, self); } if (disable_timeout) { |