From 74d3e3139fae8b31feb55ca3a9ec9bb4eb29a80d Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Thu, 26 Sep 2013 17:06:47 -0400 Subject: [PATCH] app-system: Lazily create ShellApps for apps we care about Rather than create all ShellApps up-front, create them lazily. We really had no reason to do this before as we were scanning GMenu to get all the apps, but doing this can remove a need for get_all, which is slow and memory-hungry. --- src/shell-app-system.c | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/src/shell-app-system.c b/src/shell-app-system.c index b74f523d0..628d77c2d 100644 --- a/src/shell-app-system.c +++ b/src/shell-app-system.c @@ -71,26 +71,6 @@ static void shell_app_system_class_init(ShellAppSystemClass *klass) g_type_class_add_private (gobject_class, sizeof (ShellAppSystemPrivate)); } -static void -load_apps (ShellAppSystem *self) -{ - ShellAppSystemPrivate *priv = self->priv; - GList *apps, *l; - - apps = g_app_info_get_all (); - for (l = apps; l != NULL; l = l->next) - { - GAppInfo *info = l->data; - g_hash_table_insert (priv->id_to_app, - (char *) g_app_info_get_id (info), - _shell_app_new (G_DESKTOP_APP_INFO (info))); - } - - g_list_free_full (apps, g_object_unref); - - g_signal_emit (self, signals[INSTALLED_CHANGED], 0); -} - static void shell_app_system_init (ShellAppSystem *self) { @@ -106,8 +86,6 @@ shell_app_system_init (ShellAppSystem *self) (GDestroyNotify)g_object_unref); priv->startup_wm_class_to_id = g_hash_table_new (g_str_hash, g_str_equal); - - load_apps (self); } static void @@ -150,7 +128,21 @@ ShellApp * shell_app_system_lookup_app (ShellAppSystem *self, const char *id) { - return g_hash_table_lookup (self->priv->id_to_app, id); + ShellAppSystemPrivate *priv = self->priv; + ShellApp *app; + GDesktopAppInfo *info; + + app = g_hash_table_lookup (priv->id_to_app, id); + if (app) + return app; + + info = g_desktop_app_info_new (id); + if (!info) + return NULL; + + app = _shell_app_new (info); + g_hash_table_insert (priv->id_to_app, (char *) id, app); + return app; } /**