#!/usr/bin/env bash # Select an area, save it in Pictures/Screenshots, and copy it to the clipboard. 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 } for tool in slurp grim 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 # Escape cancels without creating a file or changing the clipboard. geometry=$(slurp) || exit 0 [[ -n $geometry ]] || exit 0 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.' trap 'rm -f -- "$file"' EXIT grim -g "$geometry" "$file" || fail 'Could not capture the screen. Log back into Ferese after enabling screen capture.' trap - EXIT # Do not pass the selector lock to wl-copy's background clipboard process. wl-copy --type image/png <"$file" 9>&- || fail "Saved to $file, but could not copy to the clipboard." if command -v notify-send >/dev/null; then notify-send --app-name=Ferese 'Screenshot saved and copied' "$file" || true fi printf '%s\n' "$file"