aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCody Russell <cody.russell@canonical.com>2010-01-19 11:45:39 -0600
committerTed Gould <ted@gould.cx>2010-01-19 11:45:39 -0600
commit0b8b85b8c036b1cd78f62a9bd8db70458b65801d (patch)
treeec6def9cb20e6edbbdf9db7855bc23f78b3cd519
parentf0104e11357b5804aea2ecead13f99231b671a75 (diff)
parente9fafdfa046eda4da67357ebfc02f48159403f8d (diff)
downloadayatana-indicator-application-0b8b85b8c036b1cd78f62a9bd8db70458b65801d.tar.gz
ayatana-indicator-application-0b8b85b8c036b1cd78f62a9bd8db70458b65801d.tar.bz2
ayatana-indicator-application-0b8b85b8c036b1cd78f62a9bd8db70458b65801d.zip
Handling duplication applications getting added.
-rw-r--r--src/application-service-appstore.c57
-rw-r--r--src/libappindicator/app-indicator.c4
2 files changed, 44 insertions, 17 deletions
diff --git a/src/application-service-appstore.c b/src/application-service-appstore.c
index fa1b9d2..d0b5570 100644
--- a/src/application-service-appstore.c
+++ b/src/application-service-appstore.c
@@ -311,6 +311,28 @@ application_removed_cb (DBusGProxy * proxy, gpointer userdata)
return;
}
+static gboolean
+can_add_application (GList *applications, Application *app)
+{
+ if (applications)
+ {
+ GList *l = NULL;
+
+ for (l = applications; l != NULL; l = g_list_next (l))
+ {
+ Application *tmp_app = (Application *)l->data;
+
+ if (g_strcmp0 (tmp_app->dbus_name, app->dbus_name) == 0 &&
+ g_strcmp0 (tmp_app->dbus_object, app->dbus_object) == 0)
+ {
+ return FALSE;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
/* Change the status of the application. If we're going passive
it removes it from the panel. If we're coming online, then
it add it to the panel. Otherwise it changes the icon. */
@@ -333,8 +355,7 @@ apply_status (Application * app, ApplicationStatus status)
g_signal_emit(G_OBJECT(appstore),
signals[APPLICATION_REMOVED], 0,
position, TRUE);
-
- priv->applications = g_list_remove(priv->applications, app);
+ priv->applications = g_list_remove(priv->applications, app);
} else {
/* Figure out which icon we should be using */
gchar * newicon = app->icon;
@@ -344,21 +365,23 @@ apply_status (Application * app, ApplicationStatus status)
/* Determine whether we're already shown or not */
if (app->status == APP_STATUS_PASSIVE) {
- /* Put on panel */
- priv->applications = g_list_prepend(priv->applications, app);
-
- /* TODO: We need to have the position determined better. This
- would involve looking at the name and category and sorting
- it with the other entries. */
-
- g_signal_emit(G_OBJECT(app->appstore),
- signals[APPLICATION_ADDED], 0,
- newicon,
- 0, /* Position */
- app->dbus_name,
- app->menu,
- app->icon_path,
- TRUE);
+ if (can_add_application (priv->applications, app)) {
+ /* Put on panel */
+ priv->applications = g_list_prepend (priv->applications, app);
+
+ /* TODO: We need to have the position determined better. This
+ would involve looking at the name and category and sorting
+ it with the other entries. */
+
+ g_signal_emit(G_OBJECT(app->appstore),
+ signals[APPLICATION_ADDED], 0,
+ newicon,
+ 0, /* Position */
+ app->dbus_name,
+ app->menu,
+ app->icon_path,
+ TRUE);
+ }
} else {
/* Icon update */
gint position = get_position(app);
diff --git a/src/libappindicator/app-indicator.c b/src/libappindicator/app-indicator.c
index 6c969c2..7fabef9 100644
--- a/src/libappindicator/app-indicator.c
+++ b/src/libappindicator/app-indicator.c
@@ -370,6 +370,10 @@ app_indicator_dispose (GObject *object)
priv->menu = NULL;
}
+ if (priv->menuservice != NULL) {
+ g_object_unref (priv->menuservice);
+ }
+
if (priv->dbus_proxy != NULL) {
g_object_unref(G_OBJECT(priv->dbus_proxy));
priv->dbus_proxy = NULL;