mirror of
https://github.com/basecamp/omarchy.git
synced 2026-02-17 15:25:37 +00:00
Use desktop portal capture option which allows capturing monitors connected to external gpus (common on laptops with dedicated gpus) and supports capturing properly when hdr is enabled. Desktop portal capture allows selecting capture of a window, monitor or screen region. Add -fallback-cpu-encoding yes to use cpu encoding if the system doesn't support gpu encoding. Ideally omarchy should install vaapi drivers which would fix this issue for most users, but some users have a gpu that dont support gpu encoding at all so this option is still needed. Use pgrep with ^ as is done in waybar indicator screen-recording.sh to only grep for gpu-screen-recorder program. Update omarchy-menu to reflect not selecting region/display capture and instead allow capturing only desktop audio or desktop + microphone audio. Fixes #3367 and #3303
117 lines
3.3 KiB
Bash
Executable File
117 lines
3.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
|
|
OUTPUT_DIR="${OMARCHY_SCREENRECORD_DIR:-${XDG_VIDEOS_DIR:-$HOME/Videos}}"
|
|
|
|
if [[ ! -d "$OUTPUT_DIR" ]]; then
|
|
notify-send "Screen recording directory does not exist: $OUTPUT_DIR" -u critical -t 3000
|
|
exit 1
|
|
fi
|
|
|
|
DESKTOP_AUDIO="false"
|
|
MICROPHONE_AUDIO="false"
|
|
WEBCAM="false"
|
|
|
|
for arg in "$@"; do
|
|
case "$arg" in
|
|
--with-desktop-audio) DESKTOP_AUDIO="true" ;;
|
|
--with-microphone-audio) MICROPHONE_AUDIO="true" ;;
|
|
--with-webcam) WEBCAM="true" ;;
|
|
esac
|
|
done
|
|
|
|
cleanup_webcam() {
|
|
pkill -f "WebcamOverlay" 2>/dev/null
|
|
}
|
|
|
|
start_webcam_overlay() {
|
|
cleanup_webcam
|
|
|
|
# Get monitor scale
|
|
local scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .scale')
|
|
|
|
# Target width (base 360px, scaled to monitor)
|
|
local target_width=$(awk "BEGIN {printf \"%.0f\", 360 * $scale}")
|
|
|
|
# Try preferred 16:9 resolutions in order, use first available
|
|
local preferred_resolutions=("640x360" "1280x720" "1920x1080")
|
|
local video_size_arg=""
|
|
local available_formats=$(v4l2-ctl --list-formats-ext -d /dev/video0 2>/dev/null)
|
|
|
|
for resolution in "${preferred_resolutions[@]}"; do
|
|
if echo "$available_formats" | grep -q "$resolution"; then
|
|
video_size_arg="-video_size $resolution"
|
|
break
|
|
fi
|
|
done
|
|
|
|
ffplay -f v4l2 $video_size_arg -framerate 30 /dev/video0 \
|
|
-vf "scale=${target_width}:-1" \
|
|
-window_title "WebcamOverlay" \
|
|
-noborder \
|
|
-fflags nobuffer -flags low_delay \
|
|
-probesize 32 -analyzeduration 0 \
|
|
-loglevel quiet &
|
|
sleep 1
|
|
}
|
|
|
|
start_screenrecording() {
|
|
local filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4"
|
|
local audio_devices=""
|
|
local audio_args=""
|
|
|
|
[[ "$DESKTOP_AUDIO" == "true" ]] && audio_devices+="default_output"
|
|
|
|
if [[ "$MICROPHONE_AUDIO" == "true" ]]; then
|
|
# Merge audio tracks into one - separate tracks only play one at a time in most players
|
|
[[ -n "$audio_devices" ]] && audio_devices+="|"
|
|
audio_devices+="default_input"
|
|
fi
|
|
|
|
[[ -n "$audio_devices" ]] && audio_args+="-a $audio_devices"
|
|
|
|
gpu-screen-recorder -w portal -f 60 -fallback-cpu-encoding yes -o "$filename" $audio_args -ac aac &
|
|
toggle_screenrecording_indicator
|
|
}
|
|
|
|
stop_screenrecording() {
|
|
pkill -SIGINT -f "^gpu-screen-recorder" # SIGINT required to save video properly
|
|
|
|
# Wait a maximum of 5 seconds to finish before hard killing
|
|
local count=0
|
|
while pgrep -f "^gpu-screen-recorder" >/dev/null && [ $count -lt 50 ]; do
|
|
sleep 0.1
|
|
count=$((count + 1))
|
|
done
|
|
|
|
if pgrep -f "^gpu-screen-recorder" >/dev/null; then
|
|
pkill -9 -f "^gpu-screen-recorder"
|
|
cleanup_webcam
|
|
notify-send "Screen recording error" "Recording process had to be force-killed. Video may be corrupted." -u critical -t 5000
|
|
else
|
|
cleanup_webcam
|
|
notify-send "Screen recording saved to $OUTPUT_DIR" -t 2000
|
|
fi
|
|
toggle_screenrecording_indicator
|
|
}
|
|
|
|
toggle_screenrecording_indicator() {
|
|
pkill -RTMIN+8 waybar
|
|
}
|
|
|
|
screenrecording_active() {
|
|
pgrep -f "^gpu-screen-recorder" >/dev/null || pgrep -f "WebcamOverlay" >/dev/null
|
|
}
|
|
|
|
if screenrecording_active; then
|
|
if pgrep -f "WebcamOverlay" >/dev/null && ! pgrep -f "^gpu-screen-recorder" >/dev/null; then
|
|
cleanup_webcam
|
|
else
|
|
stop_screenrecording
|
|
fi
|
|
else
|
|
[[ "$WEBCAM" == "true" ]] && start_webcam_overlay
|
|
|
|
start_screenrecording || cleanup_webcam
|
|
fi
|