From 55e02a195373325216a47ebddc98039faf59b51c Mon Sep 17 00:00:00 2001 From: verdant Date: Mon, 3 Aug 2026 19:50:37 +0800 Subject: Sort directory items with directories first and case-insensitive name order --- src/fm.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/fm.c b/src/fm.c index 38ffa9a..865822c 100644 --- a/src/fm.c +++ b/src/fm.c @@ -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; } -- cgit v1.2.3