From 310b60793c9e87eb2a13a7c0396c09634ca08a22 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sun, 15 Jan 2012 13:50:40 +0100 Subject: Add %F and %N printf sequences for escaped file name (closes #77) --- ChangeLog | 6 ++++++ man/feh.pre | 13 +++++++++++-- src/slideshow.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 358c2e6..b0794f8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +git HEAD + + * Add %F and %N format specifiers, containing an escaped version of %f/%n. + Example: %F for foo'bar".jpg will return 'foo'"'"'bar".jpg' + + Mon, 02 Jan 2012 11:54:01 +0100 Daniel Friesel * Release v2.2 diff --git a/man/feh.pre b/man/feh.pre index 56ff766..254a5f7 100644 --- a/man/feh.pre +++ b/man/feh.pre @@ -744,6 +744,11 @@ file . Image path/filename . +.It %F +. +Escaped image path/filename +.Pq for use in shell commands +. .It %h . Image height @@ -760,6 +765,10 @@ Current mode . Image name . +.It \&%N +. +Escaped image name +. .It %p . Number of image pixels @@ -1329,7 +1338,7 @@ Open each image in /opt/images/holidays in its own window Show the images in .../presentation, sorted by name, in fullscreen, automatically change to the next image after 5 seconds . -.It feh -rSwidth -A Qo mv '%f' ~/images/'%n' Qc /opt/images +.It feh -rSwidth -A Qo mv %F ~/images/\&%N Qc /opt/images . View all images in /opt/images and below, sorted by width, move an image to ~/image/image_name when enter is pressed @@ -1343,7 +1352,7 @@ images are still in the slideshow and can be viewed normally . Same as above . -.It feh --info \&"exifgrep '\&(Model\&|DateTimeOriginal\&|FNumber\&|ISO\&|Flash\&)' '%f' \&| cut -d \&. -f 4-\&" \&. +.It feh --info \&"exifgrep '\&(Model\&|DateTimeOriginal\&|FNumber\&|ISO\&|Flash\&)' %F \&| cut -d \&. -f 4-\&" \&. . Show some EXIF information, extracted by exifprobe/exifgrep . diff --git a/src/slideshow.c b/src/slideshow.c index 42aaf2e..189357d 100644 --- a/src/slideshow.c +++ b/src/slideshow.c @@ -381,6 +381,29 @@ void feh_action_run(feh_file * file, char *action) return; } +char *shell_escape(char *input) +{ + static char ret[1024]; + unsigned int out = 0, in = 0; + + ret[out++] = '\''; + for (in = 0; input[in] && (out < (sizeof(ret) - 7)); in++) { + if (input[in] == '\'') { + ret[out++] = '\''; + ret[out++] = '"'; + ret[out++] = '\''; + ret[out++] = '"'; + ret[out++] = '\''; + } + else + ret[out++] = input[in]; + } + ret[out++] = '\''; + ret[out++] = '\0'; + + return ret; +} + char *feh_printf(char *str, feh_file * file) { char *c; @@ -397,10 +420,18 @@ char *feh_printf(char *str, feh_file * file) if (file) strcat(ret, file->filename); break; + case 'F': + if (file) + strcat(ret, shell_escape(file->filename)); + break; case 'n': if (file) strcat(ret, file->name); break; + case 'N': + if (file) + strcat(ret, shell_escape(file->name)); + break; case 'w': if (file && (file->info || !feh_file_info_load(file, NULL))) { snprintf(buf, sizeof(buf), "%d", file->info->width); -- cgit v1.2.3