#!/bin/sh # Example for $XDG_CONFIG_HOME/sxiv/exec/key-handler # Called by sxiv(1) after the external prefix key (C-x by default) is pressed. # The next key combo is passed as its first argument. Passed via stdin are the # images to act upon, one path per line: all marked images, if in thumbnail # mode and at least one image has been marked, otherwise the current image. # sxiv(1) blocks until this script terminates. It then checks which images # have been modified and reloads them. # The key combo argument has the following form: "[C-][M-][S-]KEY", # where C/M/S indicate Ctrl/Meta(Alt)/Shift modifier states and KEY is the X # keysym as listed in /usr/include/X11/keysymdef.h without the "XK_" prefix. # my dependency notes # jpegtran is owned by libjpeg-turbo # mogrify is owned by imagemagick # exiv2 is owned by exiv2 # rawtherapee is owned by rawtherapee rotate() { tr '\n' '\0' | xargs -0 realpath | sort | uniq | while read -r file; do case "$(file -b -i "$file")" in image/jpeg*) jpegtran -rotate "$1" -copy all -outfile "$file" "$file" ;; *) mogrify -rotate "$1" "$file" ;; esac done } flip() { tr '\n' '\0' | xargs -0 realpath | sort | uniq | while read -r file; do case "$(file -b -i "$file")" in image/jpeg*) jpegtran -flip "$1" -copy all -outfile "$file" "$file" ;; *) if [ "$1" = vertical ]; then mogrify -flip "$file" elif [ "$1" = horizontal ]; then mogrify -flop "$file" else exit 1 fi ;; esac done } # I choose not to put case nested in while read file loop # because it can pipe multiple files to one command? case "$1" in "d") [ "$(printf 'No\nYes' | dmenu -i -p 'delete?')" = "Yes" ] && tr '\n' '\0' | xargs -0 rm ;; "e") while read -r file; do alacritty -e sh -c "exiv2 pr -q -pa '$file' | LESS='$LESS-+F' '$PAGER'" & done ;; "f") flip vertical ;; "F") flip horizontal ;; "g") tr '\n' '\0' | xargs -0 setsid -f gimp ;; "k") tr '\n' '\0' | xargs -0 setsid -f krita ;; # `-resize "1920x1080>"` shrink large image but don't resize small iamge to larger # https://stackoverflow.com/q/6384729 # https://legacy.imagemagick.org/script/command-line-processing.php#geometry "p") tr '\n' '\0' | xargs -0 sh -c 'convert -resize "1920x1080>" -auto-orient "$@" -compress jpeg "$(time-uuid).pdf"' shell ;; # alternative using `xclip -in -selection clipboard` "y") tr '\n' '\0' | xargs -0 realpath | tr '\n' '\0' | xargs -0 printf '%q ' | xsel -ib ;; "comma") rotate 270 ;; "period") rotate 90 ;; "slash") rotate 180 ;; esac