From 56493b10ba396341971549ed1f3b11257103b105 Mon Sep 17 00:00:00 2001 From: Colin Clark Date: Mon, 8 Apr 2019 11:32:12 +0100 Subject: [PATCH] Fix #664: Recursive slideshow does not respect file sorting https://github.com/BestImageViewer/geeqie/issues/664 --- src/filedata.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/filedata.h | 1 + src/remote.c | 4 +++- src/view_dir.c | 2 +- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/filedata.c b/src/filedata.c index af6e59d3..240531ff 100644 --- a/src/filedata.c +++ b/src/filedata.c @@ -1633,6 +1633,33 @@ static void filelist_recursive_append(GList **list, GList *dirs) } } +static void filelist_recursive_append_full(GList **list, GList *dirs, SortType method, gboolean ascend) +{ + GList *work; + + work = dirs; + while (work) + { + FileData *fd = (FileData *)(work->data); + GList *f; + GList *d; + + if (filelist_read(fd, &f, &d)) + { + f = filelist_filter(f, FALSE); + f = filelist_sort_full(f, method, ascend, (GCompareFunc) filelist_sort_file_cb); + *list = g_list_concat(*list, f); + + d = filelist_filter(d, TRUE); + d = filelist_sort_path(d); + filelist_recursive_append_full(list, d, method, ascend); + filelist_free(d); + } + + work = work->next; + } +} + GList *filelist_recursive(FileData *dir_fd) { GList *list; @@ -1650,6 +1677,23 @@ GList *filelist_recursive(FileData *dir_fd) return list; } +GList *filelist_recursive_full(FileData *dir_fd, SortType method, gboolean ascend) +{ + GList *list; + GList *d; + + if (!filelist_read(dir_fd, &list, &d)) return NULL; + list = filelist_filter(list, FALSE); + list = filelist_sort_full(list, method, ascend, (GCompareFunc) filelist_sort_file_cb); + + d = filelist_filter(d, TRUE); + d = filelist_sort_path(d); + filelist_recursive_append_full(&list, d, method, ascend); + filelist_free(d); + + return list; +} + /* *----------------------------------------------------------------------------- * file modification support diff --git a/src/filedata.h b/src/filedata.h index 878bbb97..8587dcd5 100644 --- a/src/filedata.h +++ b/src/filedata.h @@ -86,6 +86,7 @@ GList *filelist_filter(GList *list, gboolean is_dir_list); GList *filelist_sort_path(GList *list); GList *filelist_recursive(FileData *dir_fd); +GList *filelist_recursive_full(FileData *dir_fd, SortType method, gboolean ascend); typedef gboolean (* FileDataGetMarkFunc)(FileData *fd, gint n, gpointer data); typedef gboolean (* FileDataSetMarkFunc)(FileData *fd, gint n, gboolean value, gpointer data); diff --git a/src/remote.c b/src/remote.c index 708fded9..b5435444 100644 --- a/src/remote.c +++ b/src/remote.c @@ -495,7 +495,9 @@ static void gr_slideshow_start_rec(const gchar *text, GIOChannel *channel, gpoin { GList *list; FileData *dir_fd = file_data_new_dir(text); - list = filelist_recursive(dir_fd); + + layout_valid(&lw_id); + list = filelist_recursive_full(dir_fd, lw_id->sort_method, lw_id->sort_ascend); file_data_unref(dir_fd); if (!list) return; //printf("length: %d\n", g_list_length(list)); diff --git a/src/view_dir.c b/src/view_dir.c index f671beaf..a98632d4 100644 --- a/src/view_dir.c +++ b/src/view_dir.c @@ -476,7 +476,7 @@ static void vd_pop_menu_slide_rec_cb(GtkWidget *widget, gpointer data) if (!vd->layout) return; if (!vd->click_fd) return; - list = filelist_recursive(vd->click_fd); + list = filelist_recursive_full(vd->click_fd, vd->layout->sort_method, vd->layout->sort_ascend); layout_image_slideshow_stop(vd->layout); layout_image_slideshow_start_from_list(vd->layout, list); -- 2.20.1