adds screen recording script and shortcut
This commit is contained in:
		@@ -141,7 +141,7 @@ bindd = $mainMod, slash, Switch to the previous workspace, workspace, previous
 | 
			
		||||
bindd = $mainMod, minus, Move active window to Special workspace, movetoworkspace,special
 | 
			
		||||
bindd = $mainMod, equal, Toggles the Special workspace, togglespecialworkspace, special
 | 
			
		||||
bindd = $mainMod, F1, Call special workspace scratchpad, togglespecialworkspace, scratchpad
 | 
			
		||||
bindd = $mainMod ALT SHIFT, F1, Move active window to special workspace scratchpad, movetoworkspacesilent, special:scratchpad
 | 
			
		||||
bindd = $mainMod ALT SHIFT, F1, Move active window to s~/.config/hypr/scripts/pecial workspace scratchpad, movetoworkspacesilent, special:scratchpad
 | 
			
		||||
 | 
			
		||||
# ======= Screenshot =======
 | 
			
		||||
# Screenshot a window
 | 
			
		||||
@@ -150,6 +150,8 @@ bind = $mainMod, PRINT, exec, hyprshot -m window
 | 
			
		||||
bind = , PRINT, exec, hyprshot -m output
 | 
			
		||||
# Screenshot a region
 | 
			
		||||
bind = $shiftMod, PRINT, exec, hyprshot -m region
 | 
			
		||||
# Screenrec
 | 
			
		||||
bind = $mainMod, S, exec, ~/.config/hypr/scripts/record-or-screenshot.sh
 | 
			
		||||
 | 
			
		||||
# ======= Additional Settings =======
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										176
									
								
								.config/hypr/scripts/record-or-screenshot.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										176
									
								
								.config/hypr/scripts/record-or-screenshot.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,176 @@
 | 
			
		||||
#!/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Menu launcher wrapper
 | 
			
		||||
menu_prompt() {
 | 
			
		||||
    if command -v tofi &>/dev/null; then
 | 
			
		||||
        printf "%b" "$1" | tofi --prompt-text="$2"
 | 
			
		||||
    elif command -v fuzzel &>/dev/null; then
 | 
			
		||||
        printf "%b" "$1" | fuzzel -d -p "$2" -w 25 -l 10
 | 
			
		||||
    elif command -v wofi &>/dev/null; then
 | 
			
		||||
        printf "%b" "$1" | wofi --dmenu --prompt="$2"
 | 
			
		||||
    elif command -v rofi &>/dev/null; then
 | 
			
		||||
        printf "%b" "$1" | rofi -dmenu -p "$2"
 | 
			
		||||
    else
 | 
			
		||||
        notify-send "No compatible launcher found" "Install tofi, fuzzel, wofi, or rofi."
 | 
			
		||||
        exit 1
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Directories
 | 
			
		||||
SCREENSHOT_DIR="${HOME}/Pictures"
 | 
			
		||||
RECORDING_DIR="${HOME}/Videos"
 | 
			
		||||
 | 
			
		||||
# Ensure directories exist
 | 
			
		||||
mkdir -p "$SCREENSHOT_DIR" "$RECORDING_DIR"
 | 
			
		||||
 | 
			
		||||
# Stop active wl-screenrec session
 | 
			
		||||
if pgrep -u "$USER" wl-screenrec > /dev/null; then
 | 
			
		||||
	pkill -INT -u "$USER" wl-screenrec
 | 
			
		||||
	notify-send "Recording stopped"
 | 
			
		||||
	
 | 
			
		||||
	# Ask if user wants to compress the video
 | 
			
		||||
	COMPRESS=$(menu_prompt "✅ compress\n❌ keep original" "🗜️ Compress video?")
 | 
			
		||||
	if [[ "$COMPRESS" == "✅ compress" ]]; then
 | 
			
		||||
		# Find the most recent video file
 | 
			
		||||
		LATEST_VIDEO=$(find "$RECORDING_DIR" -name "*.mp4" -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-)
 | 
			
		||||
		if [[ -n "$LATEST_VIDEO" ]] && [[ -f "$LATEST_VIDEO" ]]; then
 | 
			
		||||
			COMPRESSED_VIDEO="${LATEST_VIDEO%.mp4}_compressed.mp4"
 | 
			
		||||
			notify-send "Compressing video..." "This may take a moment"
 | 
			
		||||
			if ffmpeg -i "$LATEST_VIDEO" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k "$COMPRESSED_VIDEO" -y &>/dev/null; then
 | 
			
		||||
				notify-send "Compression complete" "$COMPRESSED_VIDEO"
 | 
			
		||||
				# Ask if user wants to delete original
 | 
			
		||||
				DELETE_ORIGINAL=$(menu_prompt "🗑️ delete original\n📁 keep both" "Delete original?")
 | 
			
		||||
				if [[ "$DELETE_ORIGINAL" == "🗑️ delete original" ]]; then
 | 
			
		||||
					rm "$LATEST_VIDEO"
 | 
			
		||||
					notify-send "Original deleted" "Keeping compressed version only"
 | 
			
		||||
				fi
 | 
			
		||||
			else
 | 
			
		||||
				notify-send "Compression failed" "Keeping original file"
 | 
			
		||||
			fi
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Get current outputs dynamically
 | 
			
		||||
OUTPUTS=$(hyprctl monitors | grep "Monitor" | awk '{print $2}' | paste -sd " " -)
 | 
			
		||||
 | 
			
		||||
OPTIONS=$(
 | 
			
		||||
	cat <<EOF
 | 
			
		||||
screenshot selection
 | 
			
		||||
$(for OUTPUT in $OUTPUTS; do echo "screenshot $OUTPUT"; done)
 | 
			
		||||
screenshot all
 | 
			
		||||
record selection
 | 
			
		||||
$(for OUTPUT in $OUTPUTS; do echo "record $OUTPUT"; done)
 | 
			
		||||
record all
 | 
			
		||||
EOF
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
SELECTION=$(menu_prompt "$OPTIONS" " ")
 | 
			
		||||
[ -z "$SELECTION" ] && exit 0
 | 
			
		||||
 | 
			
		||||
# Ask for audio mode if it's a recording
 | 
			
		||||
select_audio_mode() {
 | 
			
		||||
    AUDIO_MODE=$(menu_prompt "🎤 mic\n💻 internal\n🚫 none" "🎙️ Audio?")
 | 
			
		||||
    [ -z "$AUDIO_MODE" ] && echo "__cancel__" && return
 | 
			
		||||
 | 
			
		||||
    case "$AUDIO_MODE" in
 | 
			
		||||
        "🚫 none")
 | 
			
		||||
            echo ""
 | 
			
		||||
            ;;
 | 
			
		||||
        "🎤 mic")
 | 
			
		||||
            echo "--audio"
 | 
			
		||||
            ;;
 | 
			
		||||
        "💻 internal")
 | 
			
		||||
            echo "--audio --audio-device default.monitor"
 | 
			
		||||
            ;;
 | 
			
		||||
        *)
 | 
			
		||||
            echo ""
 | 
			
		||||
            ;;
 | 
			
		||||
    esac
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Screenshot or record depending on selection
 | 
			
		||||
case "$SELECTION" in
 | 
			
		||||
	"screenshot selection")
 | 
			
		||||
		TIMESTAMP="$(date +%Y-%m-%d_%H-%M-%S)"
 | 
			
		||||
		IMG="${SCREENSHOT_DIR}/${TIMESTAMP}.png"
 | 
			
		||||
		grim -g "$(slurp)" "$IMG" || { notify-send "Error" "Failed to take screenshot"; exit 1; }
 | 
			
		||||
		[ -x "$(command -v wl-copy)" ] && wl-copy < "$IMG"
 | 
			
		||||
		notify-send "Screenshot Taken" "$IMG"
 | 
			
		||||
		;;
 | 
			
		||||
 | 
			
		||||
	"screenshot all")
 | 
			
		||||
		TIMESTAMP="$(date +%Y-%m-%d_%H-%M-%S)"
 | 
			
		||||
		IMG="${SCREENSHOT_DIR}/${TIMESTAMP}.png"
 | 
			
		||||
		TEMP_FILES=()
 | 
			
		||||
		for OUTPUT in $OUTPUTS; do
 | 
			
		||||
			OUT_IMG="${IMG//.png/-$OUTPUT.png}"
 | 
			
		||||
			grim -c -o "$OUTPUT" "$OUT_IMG" && TEMP_FILES+=("$OUT_IMG")
 | 
			
		||||
		done
 | 
			
		||||
		if [ "${#TEMP_FILES[@]}" -gt 1 ]; then
 | 
			
		||||
			montage "${TEMP_FILES[@]}" -tile x1 -geometry +0+0 "$IMG"
 | 
			
		||||
			rm "${TEMP_FILES[@]}"
 | 
			
		||||
			[ -x "$(command -v wl-copy)" ] && wl-copy < "$IMG"
 | 
			
		||||
			notify-send "Screenshot Taken" "$IMG"
 | 
			
		||||
		else
 | 
			
		||||
			notify-send "Error" "Not enough outputs to montage"
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
 | 
			
		||||
	"record selection")
 | 
			
		||||
		TIMESTAMP="$(date +%Y-%m-%d_%H-%M-%S)"
 | 
			
		||||
		VID="${RECORDING_DIR}/${TIMESTAMP}.mp4"
 | 
			
		||||
		AUDIO_ARGS=$(select_audio_mode)
 | 
			
		||||
		[ "$AUDIO_ARGS" == "__cancel__" ] && notify-send "Recording cancelled" && exit 0
 | 
			
		||||
		
 | 
			
		||||
		# Get selection geometry
 | 
			
		||||
		notify-send "Select area" "Click and drag to select recording area"
 | 
			
		||||
		GEOMETRY="$(slurp)"
 | 
			
		||||
		if [ $? -ne 0 ] || [ -z "$GEOMETRY" ]; then
 | 
			
		||||
			notify-send "Recording cancelled" "Area selection was cancelled"
 | 
			
		||||
			exit 0
 | 
			
		||||
		fi
 | 
			
		||||
		
 | 
			
		||||
		# Start recording
 | 
			
		||||
		if [ -n "$AUDIO_ARGS" ]; then
 | 
			
		||||
			eval "wl-screenrec --geometry '$GEOMETRY' --filename '$VID' $AUDIO_ARGS" &
 | 
			
		||||
		else
 | 
			
		||||
			wl-screenrec --geometry "$GEOMETRY" --filename "$VID" &
 | 
			
		||||
		fi
 | 
			
		||||
		notify-send "Recording started" "Saving to $VID"
 | 
			
		||||
		;;
 | 
			
		||||
 | 
			
		||||
	"record all")
 | 
			
		||||
		notify-send "Not implemented" "Recording all screens is not supported yet."
 | 
			
		||||
		;;
 | 
			
		||||
 | 
			
		||||
	"screenshot "*)
 | 
			
		||||
		TIMESTAMP="$(date +%Y-%m-%d_%H-%M-%S)"
 | 
			
		||||
		IMG="${SCREENSHOT_DIR}/${TIMESTAMP}.png"
 | 
			
		||||
		OUT=$(echo "$SELECTION" | awk '{print $2}')
 | 
			
		||||
		grim -c -o "$OUT" "$IMG" || { notify-send "Error" "Failed to screenshot $OUT"; exit 1; }
 | 
			
		||||
		[ -x "$(command -v wl-copy)" ] && wl-copy < "$IMG"
 | 
			
		||||
		notify-send "Screenshot Taken" "$IMG"
 | 
			
		||||
		;;
 | 
			
		||||
 | 
			
		||||
	"record "*)
 | 
			
		||||
		TIMESTAMP="$(date +%Y-%m-%d_%H-%M-%S)"
 | 
			
		||||
		VID="${RECORDING_DIR}/${TIMESTAMP}.mp4"
 | 
			
		||||
		OUT=$(echo "$SELECTION" | awk '{print $2}')
 | 
			
		||||
		AUDIO_ARGS=$(select_audio_mode)
 | 
			
		||||
		[ "$AUDIO_ARGS" == "__cancel__" ] && notify-send "Recording cancelled" && exit 0
 | 
			
		||||
		
 | 
			
		||||
		# Start recording
 | 
			
		||||
		if [ -n "$AUDIO_ARGS" ]; then
 | 
			
		||||
			eval "wl-screenrec --output '$OUT' --filename '$VID' $AUDIO_ARGS" &
 | 
			
		||||
		else
 | 
			
		||||
			wl-screenrec --output "$OUT" --filename "$VID" &
 | 
			
		||||
		fi
 | 
			
		||||
		notify-send "Recording started" "Saving to $VID"
 | 
			
		||||
		;;
 | 
			
		||||
 | 
			
		||||
	*)
 | 
			
		||||
		notify-send "Invalid selection" "$SELECTION"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
		Reference in New Issue
	
	Block a user