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.
This commit is contained in:
parent
d27d9fe694
commit
7890af1659
@ -71,26 +71,6 @@ static void shell_app_system_class_init(ShellAppSystemClass *klass)
|
|||||||
g_type_class_add_private (gobject_class, sizeof (ShellAppSystemPrivate));
|
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
|
static void
|
||||||
shell_app_system_init (ShellAppSystem *self)
|
shell_app_system_init (ShellAppSystem *self)
|
||||||
{
|
{
|
||||||
@ -106,8 +86,6 @@ shell_app_system_init (ShellAppSystem *self)
|
|||||||
(GDestroyNotify)g_object_unref);
|
(GDestroyNotify)g_object_unref);
|
||||||
|
|
||||||
priv->startup_wm_class_to_id = g_hash_table_new (g_str_hash, g_str_equal);
|
priv->startup_wm_class_to_id = g_hash_table_new (g_str_hash, g_str_equal);
|
||||||
|
|
||||||
load_apps (self);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -150,7 +128,21 @@ ShellApp *
|
|||||||
shell_app_system_lookup_app (ShellAppSystem *self,
|
shell_app_system_lookup_app (ShellAppSystem *self,
|
||||||
const char *id)
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user