diff options
author | guns <self@sungpae.com> | 2013-01-18 03:19:36 -0600 |
---|---|---|
committer | guns <self@sungpae.com> | 2013-01-30 14:34:41 -0600 |
commit | 4fae6007dd64d223cdae3f977003f38e3036bada (patch) | |
tree | 8f0ad713451491efed75d5d16cfb2771fb17c249 /src | |
parent | 71c7ff9ff8eca3008f4b08ef1c4a670b9eb7c7fa (diff) |
New sort option: mtime
Sort filelist by modification time, newer files first. Useful for
perusing a directory of images by most recently added or changed.
Diffstat (limited to 'src')
-rw-r--r-- | src/filelist.c | 24 | ||||
-rw-r--r-- | src/filelist.h | 3 | ||||
-rw-r--r-- | src/help.raw | 3 | ||||
-rw-r--r-- | src/options.c | 2 |
4 files changed, 29 insertions, 3 deletions
diff --git a/src/filelist.c b/src/filelist.c index 542dbdf..8f3bfe9 100644 --- a/src/filelist.c +++ b/src/filelist.c @@ -354,6 +354,25 @@ int feh_cmp_name(void *file1, void *file2) return(strcmp(FEH_FILE(file1)->name, FEH_FILE(file2)->name)); } +/* Return -1 if file1 is _newer_ than file2 */ +int feh_cmp_mtime(void *file1, void *file2) +{ + struct stat s1, s2; + + if (stat(FEH_FILE(file1)->filename, &s1)) { + feh_print_stat_error(FEH_FILE(file1)->filename); + return(-1); + } + + if (stat(FEH_FILE(file2)->filename, &s2)) { + feh_print_stat_error(FEH_FILE(file2)->filename); + return(-1); + } + + /* gib_list_sort is not stable, so explicitly return 0 as -1 */ + return(s1.st_mtime >= s2.st_mtime ? -1 : 1); +} + int feh_cmp_width(void *file1, void *file2) { return((FEH_FILE(file1)->info->width - FEH_FILE(file2)->info->width)); @@ -381,7 +400,7 @@ int feh_cmp_format(void *file1, void *file2) void feh_prepare_filelist(void) { - if (opt.list || opt.customlist || (opt.sort > SORT_FILENAME) + if (opt.list || opt.customlist || (opt.sort > SORT_MTIME) || opt.preload || opt.min_width || opt.min_height || (opt.max_width != UINT_MAX) || (opt.max_height != UINT_MAX)) { /* For these sort options, we have to preload images */ @@ -407,6 +426,9 @@ void feh_prepare_filelist(void) case SORT_FILENAME: filelist = gib_list_sort(filelist, feh_cmp_filename); break; + case SORT_MTIME: + filelist = gib_list_sort(filelist, feh_cmp_mtime); + break; case SORT_WIDTH: filelist = gib_list_sort(filelist, feh_cmp_width); break; diff --git a/src/filelist.h b/src/filelist.h index 00e36e8..7bfd518 100644 --- a/src/filelist.h +++ b/src/filelist.h @@ -56,7 +56,7 @@ struct __feh_file_info { enum filelist_recurse { FILELIST_FIRST, FILELIST_CONTINUE, FILELIST_LAST }; -enum sort_type { SORT_NONE, SORT_NAME, SORT_FILENAME, SORT_WIDTH, +enum sort_type { SORT_NONE, SORT_NAME, SORT_FILENAME, SORT_MTIME, SORT_WIDTH, SORT_HEIGHT, SORT_PIXELS, SORT_SIZE, SORT_FORMAT @@ -82,6 +82,7 @@ void feh_save_filelist(); int feh_cmp_name(void *file1, void *file2); int feh_cmp_filename(void *file1, void *file2); +int feh_cmp_mtime(void *file1, void *file2); int feh_cmp_width(void *file1, void *file2); int feh_cmp_height(void *file1, void *file2); int feh_cmp_pixels(void *file1, void *file2); diff --git a/src/help.raw b/src/help.raw index 27e3b6c..462e715 100644 --- a/src/help.raw +++ b/src/help.raw @@ -46,7 +46,8 @@ OPTIONS -U, --loadable List all loadable files. No image display -u, --unloadable List all unloadable files. No image display -S, --sort SORT_TYPE Sort files by: - name, filename, width, height, pixels, size or format + name, filename, mtime, width, height, pixels, size, + or format -n, --reverse Reverse sort order -A, --action ACTION Specify action to perform when pressing <return>. Executed by /bin/sh, may contain FORMAT SPECIFIERS diff --git a/src/options.c b/src/options.c index cdd37d1..469115e 100644 --- a/src/options.c +++ b/src/options.c @@ -501,6 +501,8 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun) opt.sort = SORT_NAME; else if (!strcasecmp(optarg, "filename")) opt.sort = SORT_FILENAME; + else if (!strcasecmp(optarg, "mtime")) + opt.sort = SORT_MTIME; else if (!strcasecmp(optarg, "width")) opt.sort = SORT_WIDTH; else if (!strcasecmp(optarg, "height")) |