--- a/gtk/updateiconcache.c +++ b/gtk/updateiconcache.c @@ -37,6 +37,7 @@ #include #endif +#include #include #include #undef GDK_PIXBUF_DISABLE_DEPRECATED @@ -594,6 +595,50 @@ replace_backslashes_with_slashes (gchar path[i] = '/'; } +struct sortdir { + struct dirent **nl; + int cur; + int max; +}; + +static const gchar *sort_item(struct sortdir *sd) +{ + while (sd->cur >= 0) { + if (strcmp (sd->nl[sd->cur]->d_name, "..") == 0) + { + sd->cur--; + continue; + } + if (strcmp (sd->nl[sd->cur]->d_name, ".") == 0) + { + sd->cur--; + continue; + } + return sd->nl[sd->cur--]->d_name; + } + return NULL; +} + +static gboolean sort_open(char *path, struct sortdir *sd) +{ + int n; + + n = scandir(path, &sd->nl, NULL, alphasort); + if (n <= 0) + return FALSE; + sd->max = sd->cur = n - 1; + return TRUE; +} + +static void sort_close(struct sortdir *sd) +{ + int i; + + for (i = sd->max; i >= 0; i--) + free(sd->nl[i]); + free(sd->nl); +} + static GList * scan_directory (const gchar *base_path, const gchar *subdir, @@ -602,7 +647,7 @@ scan_directory (const gchar *base_path, gint depth) { GHashTable *dir_hash; - GDir *dir; + struct sortdir sortdir; const gchar *name; gchar *dir_path; gboolean dir_added = FALSE; @@ -610,15 +655,12 @@ scan_directory (const gchar *base_path, dir_path = g_build_path ("/", base_path, subdir, NULL); - /* FIXME: Use the gerror */ - dir = g_dir_open (dir_path, 0, NULL); - - if (!dir) + if (sort_open(dir_path, &sortdir) == FALSE) return directories; dir_hash = g_hash_table_new (g_str_hash, g_str_equal); - while ((name = g_dir_read_name (dir))) + while ((name = sort_item(&sortdir))) { gchar *path; gboolean retval; @@ -698,7 +740,7 @@ scan_directory (const gchar *base_path, g_free (path); } - g_dir_close (dir); + sort_close(&sortdir); /* Move dir into the big file hash */ g_hash_table_foreach_remove (dir_hash, foreach_remove_func, files);