61 lines
2.3 KiB
Bash
Executable File
61 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Capture an area or the whole desktop and open it in Satty for annotation.
|
|
set -euo pipefail
|
|
umask 077
|
|
|
|
fail() {
|
|
echo "ferese-screenshot: $*" >&2
|
|
if command -v notify-send >/dev/null; then
|
|
notify-send --app-name=Ferese --urgency=critical 'Screenshot failed' "$*" || true
|
|
fi
|
|
exit 1
|
|
}
|
|
|
|
mode=area
|
|
case ${1:-} in
|
|
'') ;;
|
|
--full) mode=full; shift ;;
|
|
--help|-h)
|
|
echo 'Usage: ferese-screenshot [--full]'
|
|
echo 'Select an area, or use --full for the whole desktop, then edit in Satty.'
|
|
exit 0
|
|
;;
|
|
*) fail 'Usage: ferese-screenshot [--full]' ;;
|
|
esac
|
|
(($# == 0)) || fail 'Usage: ferese-screenshot [--full]'
|
|
|
|
for tool in grim satty wl-copy flock; do
|
|
command -v "$tool" >/dev/null || fail "Required command not found: $tool"
|
|
done
|
|
: "${XDG_RUNTIME_DIR:?A Wayland login session is required}"
|
|
exec 9>"$XDG_RUNTIME_DIR/ferese-screenshot.lock"
|
|
flock -n 9 || exit 0
|
|
|
|
capture_args=()
|
|
if [[ $mode == area ]]; then
|
|
command -v slurp >/dev/null || fail 'Required command not found: slurp'
|
|
# Escape cancels without creating a file or changing the clipboard.
|
|
geometry=$(slurp) || exit 0
|
|
[[ -n $geometry ]] || exit 0
|
|
capture_args=(-g "$geometry")
|
|
fi
|
|
pictures=$(xdg-user-dir PICTURES 2>/dev/null) || pictures="$HOME/Pictures"
|
|
directory=${pictures:-$HOME/Pictures}/Screenshots
|
|
mkdir -p -- "$directory" || fail 'Could not create the screenshot directory.'
|
|
file=$(mktemp "$directory/Screenshot-$(date +%Y-%m-%d_%H-%M-%S)-XXXXXX.png") || fail 'Could not create the screenshot file.'
|
|
input=''
|
|
trap '[[ -z $input ]] || rm -f -- "$input"; [[ -s $file ]] || rm -f -- "$file"' EXIT
|
|
input=$(mktemp "$XDG_RUNTIME_DIR/ferese-screenshot-XXXXXX.png") || fail 'Could not create the temporary capture.'
|
|
grim "${capture_args[@]}" "$input" || fail 'Could not capture the screen. Log back into Ferese after enabling screen capture.'
|
|
# Enter saves the annotated image and copies it; Escape discards the capture.
|
|
exec 9>&-
|
|
satty --filename "$input" --output-filename "$file" \
|
|
--fullscreen current-screen \
|
|
--copy-command 'wl-copy --type image/png' \
|
|
--save-after-copy \
|
|
--actions-on-enter save-to-file,save-to-clipboard,exit \
|
|
--actions-on-escape exit || fail 'Could not open the screenshot in Satty.'
|
|
if [[ -s $file ]]; then
|
|
printf '%s\n' "$file"
|
|
fi
|