#!/bin/bash ### ### ~/.config/hypr/scripts/screenshot/screenshot_window.sh ### time=$(date +%Y-%m-%d-%H%M%S) dir="$(xdg-user-dir PICTURES)/Screenshots" file="Screenshot_${time}.png" mkdir -p "$dir" # Build selection boxes for windows on visible workspaces ids=$(hyprctl monitors -j | jq -c '[.[].activeWorkspace.id]') boxes=$(hyprctl clients -j | jq -r --argjson ids "$ids" ' [.[] | select(.workspace.id | IN($ids[]))] | .[] | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1]) \(.title)" ' | cut -d' ' -f1,2) # Let the user pick a window (click the box); exit silently if cancelled geometry=$(slurp -r <<< "$boxes") || exit 1 # Expand the selection by border + gap so the capture includes the border border=$(hyprctl getoption general:border_size -j | jq -r '(.int // 0)') gap=$(hyprctl getoption general:gaps_out -j | jq -r '(.int // 0)') pad=$(( border + gap )) geometry=$(awk -v p="$pad" ' { split($1, pos, ","); split($2, size, "x"); printf "%d,%d %dx%d\n", pos[1] - p, pos[2] - p, size[1] + p * 2, size[2] + p * 2 }' <<< "$geometry") # Capture the window, save it and copy to clipboard grim -g "$geometry" "$dir/$file" || exit 1 wl-copy -t image/png < "$dir/$file" if command -v notify-send >/dev/null 2>&1; then notify-send -a Screenshot -i camera-photo "Screenshot saved" "$file" fi # Open the editor if swappy is available (blocks until it is closed). # swappy never overwrites the opened file on Ctrl+s (it saves a new # timestamped copy to save_dir), so pass it a temporary config pointing # save_dir/save_filename_format at our exact file: Ctrl+s then saves and # exits (early_exit). -o writes the final surface when quitting with Esc/q. # Note: closing with Ctrl+w or the X button quits without saving (swappy). if command -v swappy >/dev/null 2>&1; then cfg=$(mktemp -d) mkdir -p "$cfg/swappy" printf '[Default]\nsave_dir=%s\nsave_filename_format=%s\nearly_exit=true\n' \ "$dir" "$file" > "$cfg/swappy/config" XDG_CONFIG_HOME="$cfg" swappy -f "$dir/$file" -o "$dir/$file" rm -rf "$cfg" wl-copy -t image/png < "$dir/$file" fi # Compress the resulting image in the background if oxipng is available if command -v oxipng >/dev/null 2>&1; then oxipng --strip safe -o 4 "$dir/$file" & fi