aboutsummaryrefslogtreecommitdiffstats
path: root/src/fm.c
diff options
context:
space:
mode:
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;
}