37 lines
1.5 KiB
Bash
Executable File
37 lines
1.5 KiB
Bash
Executable File
#!/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"
|