mirror of
				https://github.com/ItsDrike/dotfiles.git
				synced 2025-11-04 01:16:35 +00:00 
			
		
		
		
	Format hyprland-screenshot script
This commit is contained in:
		
							parent
							
								
									f871b7b427
								
							
						
					
					
						commit
						db58721f45
					
				
					 1 changed files with 139 additions and 140 deletions
				
			
		| 
						 | 
				
			
			@ -1,19 +1,18 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
# Inspired by grimblast (https://github.com/hyprwm/contrib/blob/main/grimblast/grimblast)
 | 
			
		||||
 | 
			
		||||
# Helper functions
 | 
			
		||||
 | 
			
		||||
die() {
 | 
			
		||||
	MSG="${1}"
 | 
			
		||||
	ERR_CODE="${2:-1}"
 | 
			
		||||
	URGENCY="${3:-critical}"
 | 
			
		||||
  MSG="${1}"
 | 
			
		||||
  ERR_CODE="${2:-1}"
 | 
			
		||||
  URGENCY="${3:-critical}"
 | 
			
		||||
 | 
			
		||||
	>&2 echo "$MSG"
 | 
			
		||||
	if [ "$NOTIFY" = "yes" ]; then
 | 
			
		||||
		notify-send -a screenshot -u "$URGENCY" "Error ($ERR_CODE)" "$MSG"
 | 
			
		||||
	fi
 | 
			
		||||
	exit "$ERR_CODE"
 | 
			
		||||
  if [ "$NOTIFY" = "yes" ]; then
 | 
			
		||||
    notify-send -a screenshot -u "$URGENCY" "Error ($ERR_CODE)" "$MSG"
 | 
			
		||||
  fi
 | 
			
		||||
  exit "$ERR_CODE"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Argument parsing
 | 
			
		||||
| 
						 | 
				
			
			@ -27,9 +26,9 @@ EDIT=no
 | 
			
		|||
DELAY=0
 | 
			
		||||
 | 
			
		||||
while [ "${1-}" ]; do
 | 
			
		||||
	case "$1" in
 | 
			
		||||
	-h | --help)
 | 
			
		||||
		>&2 cat <<EOF
 | 
			
		||||
  case "$1" in
 | 
			
		||||
  -h | --help)
 | 
			
		||||
    >&2 cat <<EOF
 | 
			
		||||
screenshot taking utility script, allowing for easy all-in-one solution for
 | 
			
		||||
controlling how a screenshot should be taken.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -54,163 +53,163 @@ Variables:
 | 
			
		|||
        - all: Everything (all visible monitors/outputs)
 | 
			
		||||
        - area: Manually select a region
 | 
			
		||||
EOF
 | 
			
		||||
		exit 0
 | 
			
		||||
		;;
 | 
			
		||||
	--notify)
 | 
			
		||||
		NOTIFY=yes
 | 
			
		||||
		shift
 | 
			
		||||
		;;
 | 
			
		||||
	--cursor)
 | 
			
		||||
		CURSOR=yes
 | 
			
		||||
		shift
 | 
			
		||||
		;;
 | 
			
		||||
	--edit)
 | 
			
		||||
		EDIT=yes
 | 
			
		||||
		shift
 | 
			
		||||
		;;
 | 
			
		||||
	--target)
 | 
			
		||||
		if [ -z "$TARGET" ]; then
 | 
			
		||||
			case "$2" in
 | 
			
		||||
			activewin | window | activemon | monitor | all | area)
 | 
			
		||||
				TARGET="$2"
 | 
			
		||||
				shift 2
 | 
			
		||||
				;;
 | 
			
		||||
			*)
 | 
			
		||||
				die "Invalid target (see TARGET variable in --help)"
 | 
			
		||||
				;;
 | 
			
		||||
			esac
 | 
			
		||||
		else
 | 
			
		||||
			die "Only one target can be passed."
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
	--delay)
 | 
			
		||||
		case "$2" in
 | 
			
		||||
		'' | *[!0-9]*)
 | 
			
		||||
			die "Argument after --delay must be an amount of MILISECONDS"
 | 
			
		||||
			;;
 | 
			
		||||
		*)
 | 
			
		||||
			DELAY="$2"
 | 
			
		||||
			shift 2
 | 
			
		||||
			;;
 | 
			
		||||
		esac
 | 
			
		||||
		;;
 | 
			
		||||
    exit 0
 | 
			
		||||
    ;;
 | 
			
		||||
  --notify)
 | 
			
		||||
    NOTIFY=yes
 | 
			
		||||
    shift
 | 
			
		||||
    ;;
 | 
			
		||||
  --cursor)
 | 
			
		||||
    CURSOR=yes
 | 
			
		||||
    shift
 | 
			
		||||
    ;;
 | 
			
		||||
  --edit)
 | 
			
		||||
    EDIT=yes
 | 
			
		||||
    shift
 | 
			
		||||
    ;;
 | 
			
		||||
  --target)
 | 
			
		||||
    if [ -z "$TARGET" ]; then
 | 
			
		||||
      case "$2" in
 | 
			
		||||
      activewin | window | activemon | monitor | all | area)
 | 
			
		||||
        TARGET="$2"
 | 
			
		||||
        shift 2
 | 
			
		||||
        ;;
 | 
			
		||||
      *)
 | 
			
		||||
        die "Invalid target (see TARGET variable in --help)"
 | 
			
		||||
        ;;
 | 
			
		||||
      esac
 | 
			
		||||
    else
 | 
			
		||||
      die "Only one target can be passed."
 | 
			
		||||
    fi
 | 
			
		||||
    ;;
 | 
			
		||||
  --delay)
 | 
			
		||||
    case "$2" in
 | 
			
		||||
    '' | *[!0-9]*)
 | 
			
		||||
      die "Argument after --delay must be an amount of MILISECONDS"
 | 
			
		||||
      ;;
 | 
			
		||||
    *)
 | 
			
		||||
      DELAY="$2"
 | 
			
		||||
      shift 2
 | 
			
		||||
      ;;
 | 
			
		||||
    esac
 | 
			
		||||
    ;;
 | 
			
		||||
 | 
			
		||||
	--copy)
 | 
			
		||||
		if [ -z "$SAVE_METHOD" ]; then
 | 
			
		||||
			SAVE_METHOD="copy"
 | 
			
		||||
			shift
 | 
			
		||||
		else
 | 
			
		||||
			die "Only one method can be passed."
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
	--save)
 | 
			
		||||
		if [ -z "$SAVE_METHOD" ]; then
 | 
			
		||||
			SAVE_METHOD="save"
 | 
			
		||||
			SAVE_FILE="$2"
 | 
			
		||||
			shift 2
 | 
			
		||||
		else
 | 
			
		||||
			die "Only one method can be passed."
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
	--copysave)
 | 
			
		||||
		if [ -z "$SAVE_METHOD" ]; then
 | 
			
		||||
			SAVE_METHOD="copysave"
 | 
			
		||||
			SAVE_FILE="$2"
 | 
			
		||||
			shift 2
 | 
			
		||||
		else
 | 
			
		||||
			die "Only one method can be passed."
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		die "Unrecognized argument: $1"
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
  --copy)
 | 
			
		||||
    if [ -z "$SAVE_METHOD" ]; then
 | 
			
		||||
      SAVE_METHOD="copy"
 | 
			
		||||
      shift
 | 
			
		||||
    else
 | 
			
		||||
      die "Only one method can be passed."
 | 
			
		||||
    fi
 | 
			
		||||
    ;;
 | 
			
		||||
  --save)
 | 
			
		||||
    if [ -z "$SAVE_METHOD" ]; then
 | 
			
		||||
      SAVE_METHOD="save"
 | 
			
		||||
      SAVE_FILE="$2"
 | 
			
		||||
      shift 2
 | 
			
		||||
    else
 | 
			
		||||
      die "Only one method can be passed."
 | 
			
		||||
    fi
 | 
			
		||||
    ;;
 | 
			
		||||
  --copysave)
 | 
			
		||||
    if [ -z "$SAVE_METHOD" ]; then
 | 
			
		||||
      SAVE_METHOD="copysave"
 | 
			
		||||
      SAVE_FILE="$2"
 | 
			
		||||
      shift 2
 | 
			
		||||
    else
 | 
			
		||||
      die "Only one method can be passed."
 | 
			
		||||
    fi
 | 
			
		||||
    ;;
 | 
			
		||||
  *)
 | 
			
		||||
    die "Unrecognized argument: $1"
 | 
			
		||||
    ;;
 | 
			
		||||
  esac
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
# Screenshot functions
 | 
			
		||||
 | 
			
		||||
takeScreenshot() {
 | 
			
		||||
	FILE="$1"
 | 
			
		||||
	GEOM="$2"
 | 
			
		||||
  FILE="$1"
 | 
			
		||||
  GEOM="$2"
 | 
			
		||||
 | 
			
		||||
	ARGS=()
 | 
			
		||||
	[ "$CURSOR" = "yes" ] && ARGS+=("-c")
 | 
			
		||||
	[ -n "$GEOM" ] && ARGS+=("-g" "$GEOM")
 | 
			
		||||
	ARGS+=("$FILE")
 | 
			
		||||
  ARGS=()
 | 
			
		||||
  [ "$CURSOR" = "yes" ] && ARGS+=("-c")
 | 
			
		||||
  [ -n "$GEOM" ] && ARGS+=("-g" "$GEOM")
 | 
			
		||||
  ARGS+=("$FILE")
 | 
			
		||||
 | 
			
		||||
	sleep "$DELAY"e-3
 | 
			
		||||
	grim "${ARGS[@]}" || die "Unable to invoke grim"
 | 
			
		||||
  sleep "$DELAY"e-3
 | 
			
		||||
  grim "${ARGS[@]}" || die "Unable to invoke grim"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
takeEditedScreenshot() {
 | 
			
		||||
	FILE="$1"
 | 
			
		||||
	GEOM="$2"
 | 
			
		||||
  FILE="$1"
 | 
			
		||||
  GEOM="$2"
 | 
			
		||||
 | 
			
		||||
	if [ "$EDIT" = "yes" ]; then
 | 
			
		||||
		takeScreenshot - "$GEOM" | swappy -f - -o "$FILE" || die "Unable to invoke swappy"
 | 
			
		||||
	else
 | 
			
		||||
		takeScreenshot "$FILE" "$GEOM"
 | 
			
		||||
	fi
 | 
			
		||||
  if [ "$EDIT" = "yes" ]; then
 | 
			
		||||
    takeScreenshot - "$GEOM" | swappy -f - -o "$FILE" || die "Unable to invoke swappy"
 | 
			
		||||
  else
 | 
			
		||||
    takeScreenshot "$FILE" "$GEOM"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Obtain the geometry for screenshot to be taken at
 | 
			
		||||
 | 
			
		||||
if [ "$TARGET" = "area" ]; then
 | 
			
		||||
	GEOM="$(slurp -d)"
 | 
			
		||||
	if [ -z "$GEOM" ]; then
 | 
			
		||||
		die "No area selected" 2 normal
 | 
			
		||||
	fi
 | 
			
		||||
	WHAT="Area"
 | 
			
		||||
  GEOM="$(slurp -d)"
 | 
			
		||||
  if [ -z "$GEOM" ]; then
 | 
			
		||||
    die "No area selected" 2 normal
 | 
			
		||||
  fi
 | 
			
		||||
  WHAT="Area"
 | 
			
		||||
elif [ "$TARGET" = "all" ]; then
 | 
			
		||||
	GEOM=""
 | 
			
		||||
	WHAT="Screen"
 | 
			
		||||
  GEOM=""
 | 
			
		||||
  WHAT="Screen"
 | 
			
		||||
elif [ "$TARGET" = "activewin" ]; then
 | 
			
		||||
	FOCUSED="$(hyprctl activewindow -j)"
 | 
			
		||||
	GEOM="$(echo "$FOCUSED" | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"')"
 | 
			
		||||
	APP_ID="$(echo "$FOCUSED" | jq -r '.class')"
 | 
			
		||||
	WHAT="$APP_ID window"
 | 
			
		||||
  FOCUSED="$(hyprctl activewindow -j)"
 | 
			
		||||
  GEOM="$(echo "$FOCUSED" | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"')"
 | 
			
		||||
  APP_ID="$(echo "$FOCUSED" | jq -r '.class')"
 | 
			
		||||
  WHAT="$APP_ID window"
 | 
			
		||||
elif [ "$TARGET" = "window" ]; then
 | 
			
		||||
	WORKSPACES="$(hyprctl monitors -j | jq -r 'map(.activeWorkspace.id)')"
 | 
			
		||||
	WINDOWS="$(hyprctl clients -j | jq -r --argjson workspaces "$WORKSPACES" 'map(select([.workspace.id] | inside($workspaces)))')"
 | 
			
		||||
	GEOM=$(echo "$WINDOWS" | jq -r '.[] | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' | slurp -r)
 | 
			
		||||
	if [ -z "$GEOM" ]; then
 | 
			
		||||
		die "No window selected" 2 normal
 | 
			
		||||
	fi
 | 
			
		||||
	WHAT="Window"
 | 
			
		||||
  WORKSPACES="$(hyprctl monitors -j | jq -r 'map(.activeWorkspace.id)')"
 | 
			
		||||
  WINDOWS="$(hyprctl clients -j | jq -r --argjson workspaces "$WORKSPACES" 'map(select([.workspace.id] | inside($workspaces)))')"
 | 
			
		||||
  GEOM=$(echo "$WINDOWS" | jq -r '.[] | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' | slurp -r)
 | 
			
		||||
  if [ -z "$GEOM" ]; then
 | 
			
		||||
    die "No window selected" 2 normal
 | 
			
		||||
  fi
 | 
			
		||||
  WHAT="Window"
 | 
			
		||||
elif [ "$TARGET" = "activemon" ]; then
 | 
			
		||||
	ACTIVEMON="$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)')"
 | 
			
		||||
	GEOM="$(echo "$ACTIVEMON" | jq -r '"\(.x),\(.y) \(.width)x\(.height)"')"
 | 
			
		||||
	WHAT="$(echo "$ACTIVEMON" | jq -r '.name')"
 | 
			
		||||
  ACTIVEMON="$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)')"
 | 
			
		||||
  GEOM="$(echo "$ACTIVEMON" | jq -r '"\(.x),\(.y) \(.width)x\(.height)"')"
 | 
			
		||||
  WHAT="$(echo "$ACTIVEMON" | jq -r '.name')"
 | 
			
		||||
elif [ "$TARGET" = "monitor" ]; then
 | 
			
		||||
	GEOM="$(slurp -o)"
 | 
			
		||||
	if [ -z "$GEOM" ]; then
 | 
			
		||||
		die "No monitor selected" 2 normal
 | 
			
		||||
	fi
 | 
			
		||||
	WHAT="Monitor"
 | 
			
		||||
  GEOM="$(slurp -o)"
 | 
			
		||||
  if [ -z "$GEOM" ]; then
 | 
			
		||||
    die "No monitor selected" 2 normal
 | 
			
		||||
  fi
 | 
			
		||||
  WHAT="Monitor"
 | 
			
		||||
else
 | 
			
		||||
	if [ -z "$TARGET" ]; then
 | 
			
		||||
		die "No target specified!"
 | 
			
		||||
	else
 | 
			
		||||
		die "Unknown target: $SAVE_METHOD"
 | 
			
		||||
	fi
 | 
			
		||||
  if [ -z "$TARGET" ]; then
 | 
			
		||||
    die "No target specified!"
 | 
			
		||||
  else
 | 
			
		||||
    die "Unknown target: $SAVE_METHOD"
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Invoke grim and capture the screenshot
 | 
			
		||||
 | 
			
		||||
if [ "$SAVE_METHOD" = "save" ]; then
 | 
			
		||||
	takeEditedScreenshot "$SAVE_FILE" "$GEOM"
 | 
			
		||||
	[ "$NOTIFY" = "yes" ] && notify-send -a screenshot "Success" "$WHAT screenshot saved" -i "$(realpath "$SAVE_FILE")"
 | 
			
		||||
  takeEditedScreenshot "$SAVE_FILE" "$GEOM"
 | 
			
		||||
  [ "$NOTIFY" = "yes" ] && notify-send -a screenshot "Success" "$WHAT screenshot saved" -i "$(realpath "$SAVE_FILE")"
 | 
			
		||||
elif [ "$SAVE_METHOD" = "copy" ]; then
 | 
			
		||||
	TEMP_FILE="$(mktemp --suffix=.png)"
 | 
			
		||||
	takeEditedScreenshot "-" "$GEOM" | tee "$TEMP_FILE" | wl-copy --type image/png || die "Clipboard error"
 | 
			
		||||
	[ "$NOTIFY" = "yes" ] && notify-send -a screenshot "Success" "$WHAT screenshot copied" -i "$(realpath "$TEMP_FILE")" && rm "$TEMP_FILE"
 | 
			
		||||
  TEMP_FILE="$(mktemp --suffix=.png)"
 | 
			
		||||
  takeEditedScreenshot "-" "$GEOM" | tee "$TEMP_FILE" | wl-copy --type image/png || die "Clipboard error"
 | 
			
		||||
  [ "$NOTIFY" = "yes" ] && notify-send -a screenshot "Success" "$WHAT screenshot copied" -i "$(realpath "$TEMP_FILE")" && rm "$TEMP_FILE"
 | 
			
		||||
elif [ "$SAVE_METHOD" = "copysave" ]; then
 | 
			
		||||
	takeEditedScreenshot "-" "$GEOM" | tee "$SAVE_FILE" | wl-copy --type image/png || die "Clipboard error"
 | 
			
		||||
	[ "$NOTIFY" = "yes" ] && notify-send -a screenshot "Success" "$WHAT screenshot copied and saved" -i "$(realpath "$SAVE_FILE")"
 | 
			
		||||
  takeEditedScreenshot "-" "$GEOM" | tee "$SAVE_FILE" | wl-copy --type image/png || die "Clipboard error"
 | 
			
		||||
  [ "$NOTIFY" = "yes" ] && notify-send -a screenshot "Success" "$WHAT screenshot copied and saved" -i "$(realpath "$SAVE_FILE")"
 | 
			
		||||
else
 | 
			
		||||
	if [ -z "$SAVE_METHOD" ]; then
 | 
			
		||||
		die "No save method specified!"
 | 
			
		||||
	else
 | 
			
		||||
		die "Unknown save method: $SAVE_METHOD"
 | 
			
		||||
	fi
 | 
			
		||||
  if [ -z "$SAVE_METHOD" ]; then
 | 
			
		||||
    die "No save method specified!"
 | 
			
		||||
  else
 | 
			
		||||
    die "Unknown save method: $SAVE_METHOD"
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue