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
|
static void
|
||||||
load_app_entry (ShellAppSystem *self,
|
get_flattened_entries_recurse (GMenuTreeDirectory *dir,
|
||||||
GMenuTreeEntry *entry)
|
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;
|
char *prefix;
|
||||||
ShellApp *app;
|
ShellApp *app;
|
||||||
|
|
||||||
if (g_hash_table_lookup (self->priv->entry_to_app, entry))
|
|
||||||
return;
|
|
||||||
|
|
||||||
prefix = get_prefix_for_entry (entry);
|
prefix = get_prefix_for_entry (entry);
|
||||||
|
|
||||||
if (prefix
|
if (prefix != NULL
|
||||||
&& !g_slist_find_custom (self->priv->known_vendor_prefixes, prefix,
|
&& !g_slist_find_custom (self->priv->known_vendor_prefixes, prefix,
|
||||||
(GCompareFunc)g_strcmp0))
|
(GCompareFunc)g_strcmp0))
|
||||||
self->priv->known_vendor_prefixes = g_slist_append (self->priv->known_vendor_prefixes,
|
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);
|
app = _shell_app_new (entry);
|
||||||
|
|
||||||
g_hash_table_insert (self->priv->entry_to_app, gmenu_tree_item_ref (entry), app);
|
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);
|
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);
|
ShellAppSystem *self = SHELL_APP_SYSTEM (user_data);
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
GMenuTreeDirectory *root;
|
GHashTable *new_settings;
|
||||||
|
GHashTableIter iter;
|
||||||
|
gpointer key, value;
|
||||||
|
|
||||||
g_assert (tree == self->priv->settings_tree);
|
g_assert (tree == self->priv->settings_tree);
|
||||||
|
|
||||||
@ -402,13 +379,18 @@ on_settings_tree_changed_cb (GMenuTree *tree,
|
|||||||
return;
|
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);
|
GMenuTreeEntry *entry = value;
|
||||||
gmenu_tree_item_unref (root);
|
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