diff options
| author | Nils Wallménius <nils@rockbox.org> | 2008-10-08 16:32:01 +0000 |
|---|---|---|
| committer | Nils Wallménius <nils@rockbox.org> | 2008-10-08 16:32:01 +0000 |
| commit | 48b52aec468309ef00fc4bfee3b3fff969969661 (patch) | |
| tree | 1c74a2cb6c17840b080e0e09fdcad0bae05fbb8c /apps/filetree.c | |
| parent | 88c60e6b07b00e737e75d157a2a9b72908d627e8 (diff) | |
| download | rockbox-48b52aec468309ef00fc4bfee3b3fff969969661.zip rockbox-48b52aec468309ef00fc4bfee3b3fff969969661.tar.gz rockbox-48b52aec468309ef00fc4bfee3b3fff969969661.tar.bz2 rockbox-48b52aec468309ef00fc4bfee3b3fff969969661.tar.xz | |
Fix FS#8949 - Alphabetical directory listing reversed after "Error Accessing Directory", patch by pondlife, some long line police by me, also kill a few error splashes in functions that could be called by threads other than UI
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18742 a1c6a512-1295-4272-9138-f99709370657
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 7ab0e6d..fc5e4d3 100644 --- a/apps/filetree.c +++ b/apps/filetree.c @@ -55,6 +55,8 @@ #include "backdrop.h" +static int compare_sort_dir; /* qsort key for sorting directories */ + int ft_build_playlist(struct tree_context* c, int start_index) { int i; @@ -189,13 +191,13 @@ static int compare(const void* p1, const void* p2) if (e1->attr & ATTR_DIRECTORY && e2->attr & ATTR_DIRECTORY) { /* two directories */ - criteria = global_settings.sort_dir; + criteria = compare_sort_dir; #ifdef HAVE_MULTIVOLUME if (e1->attr & ATTR_VOLUME || e2->attr & ATTR_VOLUME) { /* a volume identifier is involved */ if (e1->attr & ATTR_VOLUME && e2->attr & ATTR_VOLUME) - criteria = 0; /* two volumes: sort alphabetically */ + criteria = SORT_ALPHA; /* two volumes: sort alphabetically */ else /* only one is a volume: volume first */ return (e2->attr & ATTR_VOLUME) - (e1->attr & ATTR_VOLUME); } @@ -207,11 +209,12 @@ static int compare(const void* p1, const void* p2) criteria = global_settings.sort_file; } else /* dir and file, dir goes first */ - return ( e2->attr & ATTR_DIRECTORY ) - ( e1->attr & ATTR_DIRECTORY ); + return (e2->attr & ATTR_DIRECTORY) - (e1->attr & ATTR_DIRECTORY); switch(criteria) { - case 3: /* sort type */ + case SORT_TYPE: + case SORT_TYPE_REVERSED: { int t1 = e1->attr & FILE_ATTR_MASK; int t2 = e2->attr & FILE_ATTR_MASK; @@ -221,27 +224,31 @@ static int compare(const void* p1, const void* p2) if (!t2) /* unknown type */ t2 = INT_MAX; /* gets a high number, to sort after known */ - if (t1 - t2) /* if different */ - return t1 - t2; + if (t1 != t2) /* if different */ + return (t1 - t2) * (criteria == SORT_TYPE_REVERSED ? -1 : 1); /* else fall through to alphabetical sorting */ } - case 0: /* sort alphabetically asc */ - if (global_settings.sort_case) - return strncmp(e1->name, e2->name, MAX_PATH); - else - return strncasecmp(e1->name, e2->name, MAX_PATH); - case 4: /* sort alphabetically desc */ + case SORT_DATE: + case SORT_DATE_REVERSED: + /* Ignore SORT_TYPE */ + if (criteria == SORT_DATE || criteria == SORT_DATE_REVERSED) + { + if (e1->time_write != e2->time_write) + return (e1->time_write - e2->time_write) + * (criteria == SORT_DATE_REVERSED ? -1 : 1); + /* else fall through to alphabetical sorting */ + } + + case SORT_ALPHA: + case SORT_ALPHA_REVERSED: if (global_settings.sort_case) - return strncmp(e2->name, e1->name, MAX_PATH); + return strncmp(e1->name, e2->name, MAX_PATH) + * (criteria == SORT_ALPHA_REVERSED ? -1 : 1); else - return strncasecmp(e2->name, e1->name, MAX_PATH); - - case 1: /* sort date */ - return e1->time_write - e2->time_write; + return strncasecmp(e1->name, e2->name, MAX_PATH) + * (criteria == SORT_ALPHA_REVERSED ? -1 : 1); - case 2: /* sort date, newest first */ - return e2->time_write - e1->time_write; } return 0; /* never reached */ } @@ -345,6 +352,7 @@ int ft_load(struct tree_context* c, const char* tempdir) c->dirlength = i; closedir(dir); + compare_sort_dir = c->sort_dir; qsort(c->dircache,i,sizeof(struct entry),compare); /* If thumbnail talking is enabled, make an extra run to mark files with |