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