apps: Unify code for apps/settings loading more
The apps and settings loading code duplicated the part to traverse a GMenuTree. Unify this by adding a new function to return a flattened set. This will also be useful for a future change to how we store apps - this way we can look at both the current set of apps and the new set. https://bugzilla.gnome.org/show_bug.cgi?id=659351
This commit is contained in:
parent
82fc66305d
commit
e5e1b52abf
@ -245,18 +245,98 @@ get_prefix_for_entry (GMenuTreeEntry *entry)
|
||||
}
|
||||
|
||||
static void
|
||||
load_app_entry (ShellAppSystem *self,
|
||||
GMenuTreeEntry *entry)
|
||||
get_flattened_entries_recurse (GMenuTreeDirectory *dir,
|
||||
GHashTable *entry_set)
|
||||
{
|
||||
GMenuTreeIter *iter = gmenu_tree_directory_iter (dir);
|
||||
GMenuTreeItemType next_type;
|
||||
|
||||
while ((next_type = gmenu_tree_iter_next (iter)) != GMENU_TREE_ITEM_INVALID)
|
||||
{
|
||||
gpointer item = NULL;
|
||||
|
||||
switch (next_type)
|
||||
{
|
||||
case GMENU_TREE_ITEM_ENTRY:
|
||||
{
|
||||
GMenuTreeEntry *entry;
|
||||
item = entry = gmenu_tree_iter_get_entry (iter);
|
||||
/* Key is owned by entry */
|
||||
g_hash_table_replace (entry_set,
|
||||
(char*)gmenu_tree_entry_get_desktop_file_id (entry),
|
||||
gmenu_tree_item_ref (entry));
|
||||
}
|
||||
break;
|
||||
case GMENU_TREE_ITEM_DIRECTORY:
|
||||
{
|
||||
item = gmenu_tree_iter_get_directory (iter);
|
||||
get_flattened_entries_recurse ((GMenuTreeDirectory*)item, entry_set);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (item != NULL)
|
||||
gmenu_tree_item_unref (item);
|
||||
}
|
||||
|
||||
gmenu_tree_iter_unref (iter);
|
||||
}
|
||||
|
||||
static GHashTable *
|
||||
get_flattened_entries_from_tree (GMenuTree *tree)
|
||||
{
|
||||
GHashTable *table;
|
||||
GMenuTreeDirectory *root;
|
||||
|
||||
table = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||
(GDestroyNotify) NULL,
|
||||
(GDestroyNotify) gmenu_tree_item_unref);
|
||||
|
||||
root = gmenu_tree_get_root_directory (tree);
|
||||
|
||||
if (root != NULL)
|
||||
get_flattened_entries_recurse (root, table);
|
||||
|
||||
gmenu_tree_item_unref (root);
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
static void
|
||||
on_apps_tree_changed_cb (GMenuTree *tree,
|
||||
gpointer user_data)
|
||||
{
|
||||
ShellAppSystem *self = SHELL_APP_SYSTEM (user_data);
|
||||
GError *error = NULL;
|
||||
GHashTable *new_apps;
|
||||
GHashTableIter iter;
|
||||
gpointer key, value;
|
||||
|
||||
g_assert (tree == self->priv->apps_tree);
|
||||
|
||||
g_hash_table_remove_all (self->priv->entry_to_app);
|
||||
g_slist_foreach (self->priv->known_vendor_prefixes, (GFunc)g_free, NULL);
|
||||
g_slist_free (self->priv->known_vendor_prefixes);
|
||||
self->priv->known_vendor_prefixes = NULL;
|
||||
|
||||
if (!gmenu_tree_load_sync (self->priv->apps_tree, &error))
|
||||
{
|
||||
g_warning ("Failed to load apps: %s", error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
new_apps = get_flattened_entries_from_tree (self->priv->apps_tree);
|
||||
g_hash_table_iter_init (&iter, new_apps);
|
||||
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||
{
|
||||
GMenuTreeEntry *entry = value;
|
||||
char *prefix;
|
||||
ShellApp *app;
|
||||
|
||||
if (g_hash_table_lookup (self->priv->entry_to_app, entry))
|
||||
return;
|
||||
|
||||
prefix = get_prefix_for_entry (entry);
|
||||
|
||||
if (prefix
|
||||
if (prefix != NULL
|
||||
&& !g_slist_find_custom (self->priv->known_vendor_prefixes, prefix,
|
||||
(GCompareFunc)g_strcmp0))
|
||||
self->priv->known_vendor_prefixes = g_slist_append (self->priv->known_vendor_prefixes,
|
||||
@ -274,113 +354,8 @@ load_app_entry (ShellAppSystem *self,
|
||||
app = _shell_app_new (entry);
|
||||
|
||||
g_hash_table_insert (self->priv->entry_to_app, gmenu_tree_item_ref (entry), app);
|
||||
}
|
||||
|
||||
static void
|
||||
gather_apps_recurse (ShellAppSystem *self,
|
||||
GMenuTreeDirectory *root)
|
||||
{
|
||||
GMenuTreeIter *iter = gmenu_tree_directory_iter (root);
|
||||
GMenuTreeItemType next_type;
|
||||
|
||||
while ((next_type = gmenu_tree_iter_next (iter)) != GMENU_TREE_ITEM_INVALID)
|
||||
{
|
||||
gpointer item = NULL;
|
||||
|
||||
switch (next_type)
|
||||
{
|
||||
case GMENU_TREE_ITEM_ENTRY:
|
||||
{
|
||||
item = gmenu_tree_iter_get_entry (iter);
|
||||
load_app_entry (self, (GMenuTreeEntry*)item);
|
||||
}
|
||||
break;
|
||||
case GMENU_TREE_ITEM_DIRECTORY:
|
||||
{
|
||||
item = gmenu_tree_iter_get_directory (iter);
|
||||
gather_apps_recurse (self, (GMenuTreeDirectory*)item);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (item != NULL)
|
||||
gmenu_tree_item_unref (item);
|
||||
}
|
||||
|
||||
gmenu_tree_iter_unref (iter);
|
||||
}
|
||||
|
||||
static void
|
||||
gather_settings_recurse (ShellAppSystem *self,
|
||||
GMenuTreeDirectory *root)
|
||||
{
|
||||
GMenuTreeIter *iter = gmenu_tree_directory_iter (root);
|
||||
GMenuTreeItemType next_type;
|
||||
|
||||
while ((next_type = gmenu_tree_iter_next (iter)) != GMENU_TREE_ITEM_INVALID)
|
||||
{
|
||||
gpointer item = NULL;
|
||||
|
||||
switch (next_type)
|
||||
{
|
||||
case GMENU_TREE_ITEM_ENTRY:
|
||||
{
|
||||
ShellApp *app;
|
||||
|
||||
item = gmenu_tree_iter_get_entry (iter);
|
||||
if (g_hash_table_lookup (self->priv->setting_entry_to_app, item))
|
||||
return;
|
||||
|
||||
app = _shell_app_new (item);
|
||||
|
||||
g_hash_table_insert (self->priv->setting_entry_to_app, gmenu_tree_item_ref (item), app);
|
||||
}
|
||||
break;
|
||||
case GMENU_TREE_ITEM_DIRECTORY:
|
||||
{
|
||||
item = gmenu_tree_iter_get_directory (iter);
|
||||
gather_settings_recurse (self, (GMenuTreeDirectory*)item);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (item != NULL)
|
||||
gmenu_tree_item_unref (item);
|
||||
}
|
||||
|
||||
gmenu_tree_iter_unref (iter);
|
||||
}
|
||||
|
||||
static void
|
||||
on_apps_tree_changed_cb (GMenuTree *tree,
|
||||
gpointer user_data)
|
||||
{
|
||||
ShellAppSystem *self = SHELL_APP_SYSTEM (user_data);
|
||||
GError *error = NULL;
|
||||
GMenuTreeDirectory *root;
|
||||
|
||||
g_assert (tree == self->priv->apps_tree);
|
||||
|
||||
g_hash_table_remove_all (self->priv->entry_to_app);
|
||||
g_slist_foreach (self->priv->known_vendor_prefixes, (GFunc)g_free, NULL);
|
||||
g_slist_free (self->priv->known_vendor_prefixes);
|
||||
self->priv->known_vendor_prefixes = NULL;
|
||||
|
||||
if (!gmenu_tree_load_sync (self->priv->apps_tree, &error))
|
||||
{
|
||||
g_warning ("Failed to load apps: %s", error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
root = gmenu_tree_get_root_directory (self->priv->apps_tree);
|
||||
|
||||
if (root)
|
||||
{
|
||||
gather_apps_recurse (self, root);
|
||||
gmenu_tree_item_unref (root);
|
||||
}
|
||||
g_hash_table_destroy (new_apps);
|
||||
|
||||
g_signal_emit (self, signals[INSTALLED_CHANGED], 0);
|
||||
}
|
||||
@ -391,7 +366,9 @@ on_settings_tree_changed_cb (GMenuTree *tree,
|
||||
{
|
||||
ShellAppSystem *self = SHELL_APP_SYSTEM (user_data);
|
||||
GError *error = NULL;
|
||||
GMenuTreeDirectory *root;
|
||||
GHashTable *new_settings;
|
||||
GHashTableIter iter;
|
||||
gpointer key, value;
|
||||
|
||||
g_assert (tree == self->priv->settings_tree);
|
||||
|
||||
@ -402,13 +379,18 @@ on_settings_tree_changed_cb (GMenuTree *tree,
|
||||
return;
|
||||
}
|
||||
|
||||
root = gmenu_tree_get_root_directory (self->priv->settings_tree);
|
||||
new_settings = get_flattened_entries_from_tree (tree);
|
||||
|
||||
if (root)
|
||||
g_hash_table_iter_init (&iter, new_settings);
|
||||
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||
{
|
||||
gather_settings_recurse (self, root);
|
||||
gmenu_tree_item_unref (root);
|
||||
GMenuTreeEntry *entry = value;
|
||||
ShellApp *app;
|
||||
|
||||
app = _shell_app_new (entry);
|
||||
g_hash_table_insert (self->priv->setting_entry_to_app, gmenu_tree_item_ref (entry), app);
|
||||
}
|
||||
g_hash_table_destroy (new_settings);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user