2023-05-03 17:29:22 -05:00
|
|
|
#!/bin/sh
|
2023-09-21 09:11:19 -05:00
|
|
|
set -euf
|
2023-05-03 17:29:22 -05:00
|
|
|
|
2023-09-21 09:11:19 -05:00
|
|
|
OUTFILE="${HOME}/pics/screenshots/$(date +"%Y-%m-%d_%H-%M-%S").jxl" # output file template, change as needed
|
|
|
|
# menu + args, split on spaces
|
|
|
|
MENU="fzfmenu -p screenshot"
|
2023-05-03 17:29:22 -05:00
|
|
|
|
|
|
|
clean() {
|
2023-09-21 09:11:19 -05:00
|
|
|
[ -n "${freeze_pid:-}" ] && kill "$freeze_pid"
|
|
|
|
[ -f "${tmpfreeze:-}" ] && rm -f "$tmpfreeze"
|
|
|
|
[ -f "${tmpfp:-}" ] && rm -f "$tmpfp"
|
2023-05-03 17:29:22 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
save() {
|
2023-09-21 09:11:19 -05:00
|
|
|
cjxl "$tmpfp" -d 0.0 "$OUTFILE"
|
|
|
|
notify-send -u low "$OUTFILE"
|
2023-05-03 17:29:22 -05:00
|
|
|
exit 0
|
|
|
|
}
|
|
|
|
|
|
|
|
choose() {
|
|
|
|
while true; do
|
2023-09-21 09:11:19 -05:00
|
|
|
case "$(printf "save\nedit\nscan" | $MENU)" in
|
2023-05-03 17:29:22 -05:00
|
|
|
save) save ;;
|
|
|
|
edit)
|
2023-09-21 09:11:19 -05:00
|
|
|
h1="$(sha256sum "$tmpfp")"
|
|
|
|
$editor "$tmpfp"
|
|
|
|
h2="$(sha256sum "$tmpfp")"
|
|
|
|
[ "$h1" != "$h2" ] && save # change, save
|
|
|
|
exit 0
|
2023-05-03 17:29:22 -05:00
|
|
|
;;
|
|
|
|
scan)
|
|
|
|
zdata="$(zbarimg -1 "$tmpfp")" || zdata="error: scan failed with exit code $?"
|
|
|
|
export zdata
|
2023-09-21 09:11:19 -05:00
|
|
|
$TERMINAL -e sh -c 'printf "%s\n" "${zdata#*:}"; read -r __' &
|
2023-05-03 17:29:22 -05:00
|
|
|
printf '%s\n' "${zdata#*:}"
|
|
|
|
;;
|
|
|
|
*) break ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
freeze() {
|
|
|
|
tmpfreeze="$(mktemp -t screenshot_freeze_XXXX.png)"
|
2023-09-30 20:15:05 -05:00
|
|
|
$freeze_cmd "$tmpfreeze"
|
|
|
|
$freeze_img "$tmpfreeze" &
|
2023-09-21 09:11:19 -05:00
|
|
|
freeze_pid=$!
|
|
|
|
sleep 0.1
|
|
|
|
# x11: window manager makes it fullscreen
|
|
|
|
# doesn't work too well on cwm but idc
|
2023-05-03 17:29:22 -05:00
|
|
|
}
|
|
|
|
|
2023-09-21 09:11:19 -05:00
|
|
|
case "${XDG_SESSION_TYPE:-}" in
|
|
|
|
wayland)
|
|
|
|
editor="swappy -f"
|
2023-09-30 20:15:05 -05:00
|
|
|
freeze_img="swayimg -g 0,0,1920,1080"
|
|
|
|
freeze_cmd="grim -l 0"
|
2023-09-21 09:11:19 -05:00
|
|
|
ss() {
|
|
|
|
if [ -n "$REGION" ]; then
|
2023-09-30 20:15:05 -05:00
|
|
|
reg="$(slurp -f '-g "%x,%y %wx%h"')" || return 1
|
2023-09-21 09:11:19 -05:00
|
|
|
fi
|
2023-09-30 20:15:05 -05:00
|
|
|
grim ${REGION:+-g "$reg"} "$tmpfp"
|
2023-09-21 09:11:19 -05:00
|
|
|
wl-copy < "$tmpfp"
|
|
|
|
}
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
editor="gimp -n"
|
2023-09-30 20:15:05 -05:00
|
|
|
freeze_img="nsxiv -b -N SCREENSHOT_FREEZE"
|
|
|
|
freeze_cmd="shotgun"
|
2023-09-21 09:11:19 -05:00
|
|
|
ss() {
|
2023-09-30 20:15:05 -05:00
|
|
|
if [ -n "$REGION" ]; then
|
|
|
|
reg="$(hacksaw -f '-i %i -g %g')" || return 1
|
|
|
|
fi
|
|
|
|
shotgun ${SCREEN:+-s} ${REGION:+$reg} \
|
2023-09-21 09:11:19 -05:00
|
|
|
${WINDOW:+-i $(xdotool getactivewindow)} "$tmpfp"
|
|
|
|
xclip -sel clipboard -t image/png < "$tmpfp"
|
|
|
|
}
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2023-05-03 17:29:22 -05:00
|
|
|
tmpfp="$(mktemp -t screenshot_XXXX.png)"
|
2023-09-21 09:11:19 -05:00
|
|
|
trap 'clean' EXIT
|
2023-05-03 17:29:22 -05:00
|
|
|
|
2023-09-21 09:11:19 -05:00
|
|
|
SCREEN="" REGION="" WINDOW="" FREEZE="" ssopts=""
|
2023-05-03 17:29:22 -05:00
|
|
|
while getopts :srwf OPT; do
|
|
|
|
case "$OPT" in
|
2023-09-30 20:15:05 -05:00
|
|
|
s) SCREEN=1 ;; # screen
|
2023-09-21 09:11:19 -05:00
|
|
|
r) REGION=1 ;; # region
|
2023-09-30 20:15:05 -05:00
|
|
|
w) WINDOW=1 ;; # active window (don't use with region)
|
2023-05-03 17:29:22 -05:00
|
|
|
f) freeze ;; # freeze screen, only useful with -r
|
|
|
|
*) echo "invalid option: -$OPTARG" && exit 1 ;;
|
|
|
|
esac
|
|
|
|
done
|
2023-09-21 09:11:19 -05:00
|
|
|
|
2023-05-03 17:29:22 -05:00
|
|
|
ss
|
2023-09-30 20:15:05 -05:00
|
|
|
ec=$?
|
2023-09-21 09:11:19 -05:00
|
|
|
|
|
|
|
[ -n "${freeze_pid:-}" ] && kill "$freeze_pid" && freeze_pid="" # unfreeze
|
2023-09-30 20:15:05 -05:00
|
|
|
[ "$ec" -eq 0 ] && choose
|