84 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			84 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#!/bin/bash
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
							 | 
						||
| 
								 | 
							
								OUTPUT_DIR="${OMARCHY_SCREENSHOT_DIR:-${XDG_PICTURES_DIR:-$HOME/Pictures}}"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if [[ ! -d "$OUTPUT_DIR" ]]; then
							 | 
						||
| 
								 | 
							
								  notify-send "Screenshot directory does not exist: $OUTPUT_DIR" -u critical -t 3000
							 | 
						||
| 
								 | 
							
								  exit 1
							 | 
						||
| 
								 | 
							
								fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pkill slurp && exit 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								MODE="${1:-smart}"
							 | 
						||
| 
								 | 
							
								PROCESSING="${2:-slurp}"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								get_rectangles() {
							 | 
						||
| 
								 | 
							
								  local active_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .activeWorkspace.id')
							 | 
						||
| 
								 | 
							
								  hyprctl monitors -j | jq -r --arg ws "$active_workspace" '.[] | select(.activeWorkspace.id == ($ws | tonumber)) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"'
							 | 
						||
| 
								 | 
							
								  hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"'
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Select based on mode
							 | 
						||
| 
								 | 
							
								case "$MODE" in
							 | 
						||
| 
								 | 
							
								  region)
							 | 
						||
| 
								 | 
							
								    wayfreeze & PID=$!
							 | 
						||
| 
								 | 
							
								    sleep .1
							 | 
						||
| 
								 | 
							
								    SELECTION=$(slurp 2>/dev/null)
							 | 
						||
| 
								 | 
							
								    kill $PID 2>/dev/null
							 | 
						||
| 
								 | 
							
								    ;;
							 | 
						||
| 
								 | 
							
								  windows)
							 | 
						||
| 
								 | 
							
								    wayfreeze & PID=$!
							 | 
						||
| 
								 | 
							
								    sleep .1
							 | 
						||
| 
								 | 
							
								    SELECTION=$(get_rectangles | slurp -r 2>/dev/null)
							 | 
						||
| 
								 | 
							
								    kill $PID 2>/dev/null
							 | 
						||
| 
								 | 
							
								    ;;
							 | 
						||
| 
								 | 
							
								  fullscreen)
							 | 
						||
| 
								 | 
							
								    SELECTION=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"')
							 | 
						||
| 
								 | 
							
								    ;;
							 | 
						||
| 
								 | 
							
								  smart|*)
							 | 
						||
| 
								 | 
							
								    RECTS=$(get_rectangles)
							 | 
						||
| 
								 | 
							
								    wayfreeze & PID=$!
							 | 
						||
| 
								 | 
							
								    sleep .1
							 | 
						||
| 
								 | 
							
								    SELECTION=$(echo "$RECTS" | slurp 2>/dev/null)
							 | 
						||
| 
								 | 
							
								    kill $PID 2>/dev/null
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # If the selction area is L * W < 20, we'll assume you were trying to select whichever
							 | 
						||
| 
								 | 
							
								    # window or output it was inside of to prevent accidental 2px snapshots
							 | 
						||
| 
								 | 
							
								    if [[ "$SELECTION" =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+)$ ]]; then
							 | 
						||
| 
								 | 
							
								      if (( ${BASH_REMATCH[3]} * ${BASH_REMATCH[4]} < 20 )); then
							 | 
						||
| 
								 | 
							
								        click_x="${BASH_REMATCH[1]}"
							 | 
						||
| 
								 | 
							
								        click_y="${BASH_REMATCH[2]}"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        while IFS= read -r rect; do
							 | 
						||
| 
								 | 
							
								          if [[ "$rect" =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+) ]]; then
							 | 
						||
| 
								 | 
							
								            rect_x="${BASH_REMATCH[1]}"
							 | 
						||
| 
								 | 
							
								            rect_y="${BASH_REMATCH[2]}"
							 | 
						||
| 
								 | 
							
								            rect_width="${BASH_REMATCH[3]}"
							 | 
						||
| 
								 | 
							
								            rect_height="${BASH_REMATCH[4]}"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (( click_x >= rect_x && click_x < rect_x+rect_width && click_y >= rect_y && click_y < rect_y+rect_height )); then
							 | 
						||
| 
								 | 
							
								              SELECTION="${rect_x},${rect_y} ${rect_width}x${rect_height}"
							 | 
						||
| 
								 | 
							
								              break
							 | 
						||
| 
								 | 
							
								            fi
							 | 
						||
| 
								 | 
							
								          fi
							 | 
						||
| 
								 | 
							
								        done <<< "$RECTS"
							 | 
						||
| 
								 | 
							
								      fi
							 | 
						||
| 
								 | 
							
								    fi
							 | 
						||
| 
								 | 
							
								    ;;
							 | 
						||
| 
								 | 
							
								esac
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[ -z "$SELECTION" ] && exit 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if [[ $PROCESSING == "slurp" ]]; then
							 | 
						||
| 
								 | 
							
								grim -g "$SELECTION" - |
							 | 
						||
| 
								 | 
							
								  satty --filename - \
							 | 
						||
| 
								 | 
							
								    --output-filename "$OUTPUT_DIR/screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" \
							 | 
						||
| 
								 | 
							
								    --early-exit \
							 | 
						||
| 
								 | 
							
								    --actions-on-enter save-to-clipboard \
							 | 
						||
| 
								 | 
							
								    --save-after-copy \
							 | 
						||
| 
								 | 
							
								    --copy-command 'wl-copy'
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								  grim -g "$SELECTION" - | wl-copy
							 | 
						||
| 
								 | 
							
								fi
							 |