static void reread_entries (ShellAppSystem *self, GSList **cache, GHashTable *unique, GMenuTree *tree) { GMenuTreeDirectory *trunk; trunk = gmenu_tree_get_root_directory (tree); g_slist_foreach (*cache, (GFunc)shell_app_info_unref, NULL); g_slist_free (*cache); *cache = NULL; *cache = gather_entries_recurse (self, *cache, unique, trunk); gmenu_tree_item_unref (trunk); }
static GSList * gather_entries_recurse (ShellAppSystem *monitor, GSList *apps, GHashTable *unique, GMenuTreeDirectory *root) { GSList *contents; GSList *iter; contents = gmenu_tree_directory_get_contents (root); for (iter = contents; iter; iter = iter->next) { GMenuTreeItem *item = iter->data; switch (gmenu_tree_item_get_type (item)) { case GMENU_TREE_ITEM_ENTRY: { ShellAppInfo *app = shell_app_info_new_from_tree_item (item); if (!g_hash_table_lookup (unique, shell_app_info_get_id (app))) { apps = g_slist_prepend (apps, app); g_hash_table_insert (unique, (char*)shell_app_info_get_id (app), app); } } break; case GMENU_TREE_ITEM_DIRECTORY: { GMenuTreeDirectory *dir = (GMenuTreeDirectory*)item; apps = gather_entries_recurse (monitor, apps, unique, dir); } break; default: break; } gmenu_tree_item_unref (item); } g_slist_free (contents); return apps; }