diff options
| author | verdant <im@verdant.ee> | 2026-08-03 19:50:37 +0800 |
|---|---|---|
| committer | verdant <im@verdant.ee> | 2026-08-03 19:50:37 +0800 |
| commit | 55e02a195373325216a47ebddc98039faf59b51c (patch) | |
| tree | c240d3e46cbe7dd7eec02f7b5e1d2d5ef050c65b /src | |
| parent | e0522748d35e267b1b147d486e1d933096b806a2 (diff) | |
| download | sf-55e02a195373325216a47ebddc98039faf59b51c.tar.gz sf-55e02a195373325216a47ebddc98039faf59b51c.zip | |
Sort directory items with directories first and case-insensitive name order
Diffstat (limited to 'src')
| -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; } |
