aboutsummaryrefslogtreecommitdiffstats
path: root/src/fm.c
diff options
context:
space:
mode:
authorverdant <im@verdant.ee>2026-08-03 19:50:37 +0800
committerverdant <im@verdant.ee>2026-08-03 19:50:37 +0800
commit55e02a195373325216a47ebddc98039faf59b51c (patch)
treec240d3e46cbe7dd7eec02f7b5e1d2d5ef050c65b /src/fm.c
parente0522748d35e267b1b147d486e1d933096b806a2 (diff)
downloadsf-55e02a195373325216a47ebddc98039faf59b51c.tar.gz
sf-55e02a195373325216a47ebddc98039faf59b51c.zip
Sort directory items with directories first and case-insensitive name order
Diffstat (limited to 'src/fm.c')
-rw-r--r--src/fm.c26
1 files changed, 26 insertions, 0 deletions
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;
}