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,42 +245,10 @@ 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)
|
||||||
{
|
{
|
||||||
char *prefix;
|
GMenuTreeIter *iter = gmenu_tree_directory_iter (dir);
|
||||||
ShellApp *app;
|
|
||||||
|
|
||||||
if (g_hash_table_lookup (self->priv->entry_to_app, entry))
|
|
||||||
return;
|
|
||||||
|
|
||||||
prefix = get_prefix_for_entry (entry);
|
|
||||||
|
|
||||||
if (prefix
|
|
||||||
&& !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,
|
|
||||||
prefix);
|
|
||||||
else
|
|
||||||
g_free (prefix);
|
|
||||||
|
|
||||||
/* Here we check to see whether the app is still running; if so, we
|
|
||||||
* keep the old data around.
|
|
||||||
*/
|
|
||||||
app = g_hash_table_lookup (self->priv->running_apps, gmenu_tree_entry_get_desktop_file_id (entry));
|
|
||||||
if (app != NULL)
|
|
||||||
app = g_object_ref (app);
|
|
||||||
else
|
|
||||||
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;
|
GMenuTreeItemType next_type;
|
||||||
|
|
||||||
while ((next_type = gmenu_tree_iter_next (iter)) != GMENU_TREE_ITEM_INVALID)
|
while ((next_type = gmenu_tree_iter_next (iter)) != GMENU_TREE_ITEM_INVALID)
|
||||||
@ -291,14 +259,18 @@ gather_apps_recurse (ShellAppSystem *self,
|
|||||||
{
|
{
|
||||||
case GMENU_TREE_ITEM_ENTRY:
|
case GMENU_TREE_ITEM_ENTRY:
|
||||||
{
|
{
|
||||||
item = gmenu_tree_iter_get_entry (iter);
|
GMenuTreeEntry *entry;
|
||||||
load_app_entry (self, (GMenuTreeEntry*)item);
|
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;
|
break;
|
||||||
case GMENU_TREE_ITEM_DIRECTORY:
|
case GMENU_TREE_ITEM_DIRECTORY:
|
||||||
{
|
{
|
||||||
item = gmenu_tree_iter_get_directory (iter);
|
item = gmenu_tree_iter_get_directory (iter);
|
||||||
gather_apps_recurse (self, (GMenuTreeDirectory*)item);
|
get_flattened_entries_recurse ((GMenuTreeDirectory*)item, entry_set);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -311,46 +283,24 @@ gather_apps_recurse (ShellAppSystem *self,
|
|||||||
gmenu_tree_iter_unref (iter);
|
gmenu_tree_iter_unref (iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static GHashTable *
|
||||||
gather_settings_recurse (ShellAppSystem *self,
|
get_flattened_entries_from_tree (GMenuTree *tree)
|
||||||
GMenuTreeDirectory *root)
|
|
||||||
{
|
{
|
||||||
GMenuTreeIter *iter = gmenu_tree_directory_iter (root);
|
GHashTable *table;
|
||||||
GMenuTreeItemType next_type;
|
GMenuTreeDirectory *root;
|
||||||
|
|
||||||
while ((next_type = gmenu_tree_iter_next (iter)) != GMENU_TREE_ITEM_INVALID)
|
table = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
{
|
(GDestroyNotify) NULL,
|
||||||
gpointer item = NULL;
|
(GDestroyNotify) gmenu_tree_item_unref);
|
||||||
|
|
||||||
switch (next_type)
|
root = gmenu_tree_get_root_directory (tree);
|
||||||
{
|
|
||||||
case GMENU_TREE_ITEM_ENTRY:
|
if (root != NULL)
|
||||||
{
|
get_flattened_entries_recurse (root, table);
|
||||||
ShellApp *app;
|
|
||||||
|
|
||||||
item = gmenu_tree_iter_get_entry (iter);
|
gmenu_tree_item_unref (root);
|
||||||
if (g_hash_table_lookup (self->priv->setting_entry_to_app, item))
|
|
||||||
return;
|
return table;
|
||||||
|
|
||||||
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
|
static void
|
||||||
@ -359,7 +309,9 @@ on_apps_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_apps;
|
||||||
|
GHashTableIter iter;
|
||||||
|
gpointer key, value;
|
||||||
|
|
||||||
g_assert (tree == self->priv->apps_tree);
|
g_assert (tree == self->priv->apps_tree);
|
||||||
|
|
||||||
@ -374,13 +326,36 @@ on_apps_tree_changed_cb (GMenuTree *tree,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
root = gmenu_tree_get_root_directory (self->priv->apps_tree);
|
new_apps = get_flattened_entries_from_tree (self->priv->apps_tree);
|
||||||
|
g_hash_table_iter_init (&iter, new_apps);
|
||||||
if (root)
|
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||||
{
|
{
|
||||||
gather_apps_recurse (self, root);
|
GMenuTreeEntry *entry = value;
|
||||||
gmenu_tree_item_unref (root);
|
char *prefix;
|
||||||
|
ShellApp *app;
|
||||||
|
|
||||||
|
prefix = get_prefix_for_entry (entry);
|
||||||
|
|
||||||
|
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,
|
||||||
|
prefix);
|
||||||
|
else
|
||||||
|
g_free (prefix);
|
||||||
|
|
||||||
|
/* Here we check to see whether the app is still running; if so, we
|
||||||
|
* keep the old data around.
|
||||||
|
*/
|
||||||
|
app = g_hash_table_lookup (self->priv->running_apps, gmenu_tree_entry_get_desktop_file_id (entry));
|
||||||
|
if (app != NULL)
|
||||||
|
app = g_object_ref (app);
|
||||||
|
else
|
||||||
|
app = _shell_app_new (entry);
|
||||||
|
|
||||||
|
g_hash_table_insert (self->priv->entry_to_app, gmenu_tree_item_ref (entry), app);
|
||||||
}
|
}
|
||||||
|
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