diff options
author | Ted Gould <ted@gould.cx> | 2010-02-08 09:33:13 -0600 |
---|---|---|
committer | Ted Gould <ted@gould.cx> | 2010-02-08 09:33:13 -0600 |
commit | 89972d214c5a8e65783cd83e82ac3ef9c1b915c8 (patch) | |
tree | e031e730ac8d7e80a51aa4a9e6e41de1b164873b /src/libappindicator | |
parent | 08f04e0260f602442bf7bae6ad113c8f53b8dd96 (diff) | |
parent | e6056c5c268be7056a79bb6c5fc0b5408dea2994 (diff) | |
download | ayatana-indicator-application-89972d214c5a8e65783cd83e82ac3ef9c1b915c8.tar.gz ayatana-indicator-application-89972d214c5a8e65783cd83e82ac3ef9c1b915c8.tar.bz2 ayatana-indicator-application-89972d214c5a8e65783cd83e82ac3ef9c1b915c8.zip |
* Upstream Merge
* Handling the service restarting better by removing the icons
after a small delay to ensure they don't return.
* Fixing a crash where a proxy was created while the previous
one was being destroyed.
Diffstat (limited to 'src/libappindicator')
-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) { |