diff options
| -rw-r--r-- | src/fm.c | 26 |
1 files changed, 26 insertions, 0 deletions
@@ -37,9 +37,34 @@ static void fm_file_items_realloc(file_list *l); static char *detect_file_type(const char *filepath); static void fm_getenv(void); static char *xgetenv(const char *const name, char *fallback); +static int cmp_file_items(const void *a, const void *b); +static void qsort_file_lists(file_list *list); bool fm_preview_file(window *w, const char *path); /* Functions */ +static int +cmp_file_items(const void *a, const void *b) +{ + const file_item *item_a = (const file_item *)a; + const file_item *item_b = (const file_item *)b; + + if (item_a->is_dir != item_b->is_dir) { + return item_b->is_dir - item_a->is_dir; + } + + return strcasecmp(item_a->name, item_b->name); +} + +static void +qsort_file_lists(file_list *list) +{ + if (!list || !list->items || list->count <= 1) { + return; + } + + qsort(list->items, list->count, sizeof(file_item), cmp_file_items); +} + static fm_info * fm_w_init(terminal *term) @@ -166,6 +191,7 @@ fm_getdir(file_list *list, const char *path) } closedir(dir); + qsort_file_lists(new_list); return new_list; } |
