#!/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