diff options
Diffstat (limited to 'apps/filetree.c')
-rw-r--r-- | apps/filetree.c | 46 |
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 | ||
58 | static int compare_sort_dir; /* qsort key for sorting directories */ | ||
59 | |||
58 | int ft_build_playlist(struct tree_context* c, int start_index) | 60 | int 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 |