From f0461a03f3873858c8febb6a3eac83c04496ac4d Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sat, 23 Jan 2021 11:07:44 +0100 Subject: wallpaper.h: Remove useless _XFUNCPROTO wrappers feh is C code, _XFUNCPROTO(BEGIN|END) are only needed for C++ applications. --- src/wallpaper.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/wallpaper.h b/src/wallpaper.h index cf52d2d..77769f8 100644 --- a/src/wallpaper.h +++ b/src/wallpaper.h @@ -42,7 +42,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. extern Window ipc_win; extern Atom ipc_atom; -_XFUNCPROTOBEGIN extern Window enl_ipc_get_win(void); +extern Window enl_ipc_get_win(void); extern void enl_ipc_send(char *); extern char *enl_wait_for_reply(void); extern char *enl_ipc_get(const char *); @@ -53,5 +53,4 @@ extern int feh_wm_get_num_desks(void); extern signed char feh_wm_get_wm_is_e(void); void feh_wm_set_bg_filelist(unsigned char bgmode); -_XFUNCPROTOEND #endif -- cgit v1.2.3 From 9353845a5f397a36440263800d9a70a80ab609ad Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sun, 24 Jan 2021 05:40:15 +0100 Subject: free opt.start_list_at before NULLing it --- src/slideshow.c | 2 ++ src/thumbnail.c | 1 + 2 files changed, 3 insertions(+) diff --git a/src/slideshow.c b/src/slideshow.c index 3a3cd0a..9154d2d 100644 --- a/src/slideshow.c +++ b/src/slideshow.c @@ -57,6 +57,7 @@ void init_slideshow_mode(void) // Try finding an exact filename match first for (; l && opt.start_list_at; l = l->next) { if (!strcmp(opt.start_list_at, FEH_FILE(l->data)->filename)) { + free(opt.start_list_at); opt.start_list_at = NULL; break; } @@ -83,6 +84,7 @@ void init_slideshow_mode(void) current_filename = FEH_FILE(l->data)->filename; } if (!strcmp(start_at_filename, current_filename)) { + free(opt.start_list_at); opt.start_list_at = NULL; break; } diff --git a/src/thumbnail.c b/src/thumbnail.c index e7b05a8..9781027 100644 --- a/src/thumbnail.c +++ b/src/thumbnail.c @@ -411,6 +411,7 @@ void init_thumbnail_mode(void) else if (opt.start_list_at) { for (l = thumbnails; l; l = l->next) { if (!strcmp(opt.start_list_at, FEH_THUMB(l->data)->file->filename)) { + free(opt.start_list_at); opt.start_list_at = NULL; feh_thumbnail_select(winwid, FEH_THUMB(l->data)); break; -- cgit v1.2.3 From 9ba35b0c7f82d49158accba691964b3d26290cbd Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sun, 24 Jan 2021 05:44:17 +0100 Subject: Handle URL-encoded components in "feh --start-at file://...." Closes #584 --- src/filelist.c | 28 ++++++++++++++++++++++++++++ src/filelist.h | 1 + src/options.c | 21 ++++++++++++++++++--- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/filelist.c b/src/filelist.c index ae8d7b2..9d8b38a 100644 --- a/src/filelist.c +++ b/src/filelist.c @@ -28,6 +28,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #endif +#ifdef HAVE_LIBCURL +#include +#endif + #include "feh.h" #include "filelist.h" #include "signals.h" @@ -678,3 +682,27 @@ void feh_save_filelist() free(tmpname); return; } + +#ifdef HAVE_LIBCURL + +char *feh_http_unescape(char *url) +{ + CURL *curl = curl_easy_init(); + if (!curl) { + return NULL; + } + char *tmp_url = curl_easy_unescape(curl, url, 0, NULL); + char *new_url = estrdup(tmp_url); + curl_free(tmp_url); + curl_easy_cleanup(curl); + return new_url; +} + +#else + +char *feh_http_unescape(char *url) +{ + return NULL; +} + +#endif diff --git a/src/filelist.h b/src/filelist.h index e24a6a6..ff0645e 100644 --- a/src/filelist.h +++ b/src/filelist.h @@ -97,6 +97,7 @@ gib_list *feh_read_filelist(char *filename); char *feh_absolute_path(char *path); gib_list *feh_file_remove_from_list(gib_list * list, gib_list * l); void feh_save_filelist(); +char *feh_http_unescape(char * url); int feh_cmp_name(void *file1, void *file2); int feh_cmp_dirname(void *file1, void *file2); diff --git a/src/options.c b/src/options.c index 04f02c5..02c9b83 100644 --- a/src/options.c +++ b/src/options.c @@ -855,11 +855,26 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun) */ if (opt.start_list_at && path_is_url(opt.start_list_at) && (strlen(opt.start_list_at) <= 8 || strncmp(opt.start_list_at, "file:///", 8) != 0)) { add_file_to_filelist_recursively(opt.start_list_at, FILELIST_FIRST); + /* + * Otherwise, make "feh --start-at dir/file.jpg" behave like + * "feh --start-at dir/file.jpg dir". + */ } else if (opt.start_list_at && strrchr(opt.start_list_at, '/')) { + /* + * feh can't candle urlencoded path components ("some%20dir" etc). + * Use libcurl to unescape them if --start-at is file://... + */ if (strlen(opt.start_list_at) > 8 && strncmp(opt.start_list_at, "file:///", 8) == 0) { - char *start_at_path = estrdup(opt.start_list_at + 7); - free(opt.start_list_at); - opt.start_list_at = start_at_path; + char *unescaped_path = feh_http_unescape(opt.start_list_at); + if (unescaped_path != NULL) { + free(opt.start_list_at); + opt.start_list_at = estrdup(unescaped_path + 7); + free(unescaped_path); + } else { + char *new_path = estrdup(opt.start_list_at + 7); + free(opt.start_list_at); + opt.start_list_at = new_path; + } } char *target_directory = estrdup(opt.start_list_at); char *filename_start = strrchr(target_directory, '/'); -- cgit v1.2.3 From 9bb679d2d14f41c74ad72b962694808116560213 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Mon, 25 Jan 2021 17:51:17 +0100 Subject: Release v3.6.3 --- ChangeLog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ChangeLog b/ChangeLog index 79ea578..71cbece 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Mon, 25 Jan 2021 17:46:57 +0100 Daniel Friesel + +* Release v3.6.3 + * Fix --start-at not handling URL-encoded file:/// paths properly. Notably, + this also fixes feh not displaying images with spaces or unicode + elements in their path when opened from a file manager. + Sat, 09 Jan 2021 12:28:06 +0100 Daniel Friesel * Release v3.6.2 -- cgit v1.2.3