summaryrefslogtreecommitdiff
path: root/apps/filetree.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/filetree.c')
-rw-r--r--apps/filetree.c46
1 files changed, 27 insertions, 19 deletions
diff --git a/apps/filetree.c b/apps/filetree.c
index 7ab0e6d0cf..fc5e4d3934 100644
--- a/apps/filetree.c
+++ b/apps/filetree.c
@@ -55,6 +55,8 @@
55 55
56#include "backdrop.h" 56#include "backdrop.h"
57 57
58static int compare_sort_dir; /* qsort key for sorting directories */
59
58int ft_build_playlist(struct tree_context* c, int start_index) 60int ft_build_playlist(struct tree_context* c, int start_index)
59{ 61{
60 int i; 62 int i;
@@ -189,13 +191,13 @@ static int compare(const void* p1, const void* p2)
189 191
190 if (e1->attr & ATTR_DIRECTORY && e2->attr & ATTR_DIRECTORY) 192 if (e1->attr & ATTR_DIRECTORY && e2->attr & ATTR_DIRECTORY)
191 { /* two directories */ 193 { /* two directories */
192 criteria = global_settings.sort_dir; 194 criteria = compare_sort_dir;
193 195
194#ifdef HAVE_MULTIVOLUME 196#ifdef HAVE_MULTIVOLUME
195 if (e1->attr & ATTR_VOLUME || e2->attr & ATTR_VOLUME) 197 if (e1->attr & ATTR_VOLUME || e2->attr & ATTR_VOLUME)
196 { /* a volume identifier is involved */ 198 { /* a volume identifier is involved */
197 if (e1->attr & ATTR_VOLUME && e2->attr & ATTR_VOLUME) 199 if (e1->attr & ATTR_VOLUME && e2->attr & ATTR_VOLUME)
198 criteria = 0; /* two volumes: sort alphabetically */ 200 criteria = SORT_ALPHA; /* two volumes: sort alphabetically */
199 else /* only one is a volume: volume first */ 201 else /* only one is a volume: volume first */
200 return (e2->attr & ATTR_VOLUME) - (e1->attr & ATTR_VOLUME); 202 return (e2->attr & ATTR_VOLUME) - (e1->attr & ATTR_VOLUME);
201 } 203 }
@@ -207,11 +209,12 @@ static int compare(const void* p1, const void* p2)
207 criteria = global_settings.sort_file; 209 criteria = global_settings.sort_file;
208 } 210 }
209 else /* dir and file, dir goes first */ 211 else /* dir and file, dir goes first */
210 return ( e2->attr & ATTR_DIRECTORY ) - ( e1->attr & ATTR_DIRECTORY ); 212 return (e2->attr & ATTR_DIRECTORY) - (e1->attr & ATTR_DIRECTORY);
211 213
212 switch(criteria) 214 switch(criteria)
213 { 215 {
214 case 3: /* sort type */ 216 case SORT_TYPE:
217 case SORT_TYPE_REVERSED:
215 { 218 {
216 int t1 = e1->attr & FILE_ATTR_MASK; 219 int t1 = e1->attr & FILE_ATTR_MASK;
217 int t2 = e2->attr & FILE_ATTR_MASK; 220 int t2 = e2->attr & FILE_ATTR_MASK;
@@ -221,27 +224,31 @@ static int compare(const void* p1, const void* p2)
221 if (!t2) /* unknown type */ 224 if (!t2) /* unknown type */
222 t2 = INT_MAX; /* gets a high number, to sort after known */ 225 t2 = INT_MAX; /* gets a high number, to sort after known */
223 226
224 if (t1 - t2) /* if different */ 227 if (t1 != t2) /* if different */
225 return t1 - t2; 228 return (t1 - t2) * (criteria == SORT_TYPE_REVERSED ? -1 : 1);
226 /* else fall through to alphabetical sorting */ 229 /* else fall through to alphabetical sorting */
227 } 230 }
228 case 0: /* sort alphabetically asc */
229 if (global_settings.sort_case)
230 return strncmp(e1->name, e2->name, MAX_PATH);
231 else
232 return strncasecmp(e1->name, e2->name, MAX_PATH);
233 231
234 case 4: /* sort alphabetically desc */ 232 case SORT_DATE:
233 case SORT_DATE_REVERSED:
234 /* Ignore SORT_TYPE */
235 if (criteria == SORT_DATE || criteria == SORT_DATE_REVERSED)
236 {
237 if (e1->time_write != e2->time_write)
238 return (e1->time_write - e2->time_write)
239 * (criteria == SORT_DATE_REVERSED ? -1 : 1);
240 /* else fall through to alphabetical sorting */
241 }
242
243 case SORT_ALPHA:
244 case SORT_ALPHA_REVERSED:
235 if (global_settings.sort_case) 245 if (global_settings.sort_case)
236 return strncmp(e2->name, e1->name, MAX_PATH); 246 return strncmp(e1->name, e2->name, MAX_PATH)
247 * (criteria == SORT_ALPHA_REVERSED ? -1 : 1);
237 else 248 else
238 return strncasecmp(e2->name, e1->name, MAX_PATH); 249 return strncasecmp(e1->name, e2->name, MAX_PATH)
239 250 * (criteria == SORT_ALPHA_REVERSED ? -1 : 1);
240 case 1: /* sort date */
241 return e1->time_write - e2->time_write;
242 251
243 case 2: /* sort date, newest first */
244 return e2->time_write - e1->time_write;
245 } 252 }
246 return 0; /* never reached */ 253 return 0; /* never reached */
247} 254}
@@ -345,6 +352,7 @@ int ft_load(struct tree_context* c, const char* tempdir)
345 c->dirlength = i; 352 c->dirlength = i;
346 closedir(dir); 353 closedir(dir);
347 354
355 compare_sort_dir = c->sort_dir;
348 qsort(c->dircache,i,sizeof(struct entry),compare); 356 qsort(c->dircache,i,sizeof(struct entry),compare);
349 357
350 /* If thumbnail talking is enabled, make an extra run to mark files with 358 /* If thumbnail talking is enabled, make an extra run to mark files with