Redesign screen capture option

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
This commit is contained in:
dec05eba
2025-11-14 13:42:24 +01:00
committed by Ryan Hughes
parent cb869457c4
commit 128a6125a9
2 changed files with 26 additions and 54 deletions

View File

@@ -8,15 +8,15 @@ if [[ ! -d "$OUTPUT_DIR" ]]; then
exit 1 exit 1
fi fi
SCOPE="" DESKTOP_AUDIO="false"
AUDIO="false" MICROPHONE_AUDIO="false"
WEBCAM="false" WEBCAM="false"
for arg in "$@"; do for arg in "$@"; do
case "$arg" in case "$arg" in
--with-audio) AUDIO="true" ;; --with-desktop-audio) DESKTOP_AUDIO="true" ;;
--with-microphone-audio) MICROPHONE_AUDIO="true" ;;
--with-webcam) WEBCAM="true" ;; --with-webcam) WEBCAM="true" ;;
output|region) SCOPE="$arg" ;;
esac esac
done done
@@ -57,27 +57,35 @@ start_webcam_overlay() {
start_screenrecording() { start_screenrecording() {
local filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4" local filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4"
local audio_devices=""
local audio_args="" local audio_args=""
# Merge audio tracks into one - separate tracks only play one at a time in most players [[ "$DESKTOP_AUDIO" == "true" ]] && audio_devices+="default_output"
[[ "$AUDIO" == "true" ]] && audio_args="-a default_output|default_input"
gpu-screen-recorder -w "$@" -f 60 -c mp4 $audio_args -ac aac -o "$filename" & 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 toggle_screenrecording_indicator
} }
stop_screenrecording() { stop_screenrecording() {
pkill -SIGINT -f "gpu-screen-recorder" # SIGINT required to save video properly pkill -SIGINT -f "^gpu-screen-recorder" # SIGINT required to save video properly
# Wait a maximum of 5 seconds to finish before hard killing # Wait a maximum of 5 seconds to finish before hard killing
local count=0 local count=0
while pgrep -f "gpu-screen-recorder" >/dev/null && [ $count -lt 50 ]; do while pgrep -f "^gpu-screen-recorder" >/dev/null && [ $count -lt 50 ]; do
sleep 0.1 sleep 0.1
count=$((count + 1)) count=$((count + 1))
done done
if pgrep -f "gpu-screen-recorder" >/dev/null; then if pgrep -f "^gpu-screen-recorder" >/dev/null; then
pkill -9 -f "gpu-screen-recorder" pkill -9 -f "^gpu-screen-recorder"
cleanup_webcam cleanup_webcam
notify-send "Screen recording error" "Recording process had to be force-killed. Video may be corrupted." -u critical -t 5000 notify-send "Screen recording error" "Recording process had to be force-killed. Video may be corrupted." -u critical -t 5000
else else
@@ -92,51 +100,17 @@ toggle_screenrecording_indicator() {
} }
screenrecording_active() { screenrecording_active() {
pgrep -f "gpu-screen-recorder" >/dev/null || pgrep -x slurp >/dev/null || pgrep -f "WebcamOverlay" >/dev/null pgrep -f "^gpu-screen-recorder" >/dev/null || pgrep -f "WebcamOverlay" >/dev/null
} }
if screenrecording_active; then if screenrecording_active; then
if pgrep -x slurp >/dev/null; then if pgrep -f "WebcamOverlay" >/dev/null && ! pgrep -f "^gpu-screen-recorder" >/dev/null; then
pkill -x slurp 2>/dev/null
elif pgrep -f "WebcamOverlay" >/dev/null && ! pgrep -f "gpu-screen-recorder" >/dev/null; then
cleanup_webcam cleanup_webcam
else else
stop_screenrecording stop_screenrecording
fi fi
elif [[ "$SCOPE" == "output" ]]; then
[[ "$WEBCAM" == "true" ]] && start_webcam_overlay
if ! output=$(slurp -o -f "%o"); then
[[ "$WEBCAM" == "true" ]] && cleanup_webcam
exit 1
fi
if [[ -z "$output" ]]; then
notify-send "Error" "Could not detect monitor" -u critical
[[ "$WEBCAM" == "true" ]] && cleanup_webcam
exit 1
fi
start_screenrecording "$output"
else else
[[ "$WEBCAM" == "true" ]] && start_webcam_overlay [[ "$WEBCAM" == "true" ]] && start_webcam_overlay
scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .scale') start_screenrecording || cleanup_webcam
if ! region=$(slurp -f "%wx%h+%x+%y"); then
[[ "$WEBCAM" == "true" ]] && cleanup_webcam
exit 1
fi
if [[ "$region" =~ ^([0-9]+)x([0-9]+)\+([0-9]+)\+([0-9]+)$ ]]; then
w=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[1]} * $scale}")
h=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[2]} * $scale}")
x=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[3]} * $scale}")
y=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[4]} * $scale}")
scaled_region="${w}x${h}+${x}+${y}"
else
scaled_region="$region"
fi
start_screenrecording region -region "$scaled_region"
fi fi

View File

@@ -112,12 +112,10 @@ show_screenshot_menu() {
} }
show_screenrecord_menu() { show_screenrecord_menu() {
case $(menu "Screenrecord" " Region\n Region + Audio\n Display\n Display + Audio\n Display + Webcam") in case $(menu "Screenrecord" " With desktop audio\n With desktop + microphone audio\n With desktop + microphone audio + webcam") in
*"Region + Audio"*) omarchy-cmd-screenrecord region --with-audio ;; *"With desktop audio"*) omarchy-cmd-screenrecord --with-desktop-audio ;;
*Region*) omarchy-cmd-screenrecord ;; *"With desktop + microphone audio"*) omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio ;;
*"Display + Audio"*) omarchy-cmd-screenrecord output --with-audio ;; *"With desktop + microphone audio + webcam"*) omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio --with-webcam ;;
*"Display + Webcam"*) omarchy-cmd-screenrecord output --with-audio --with-webcam ;;
*Display*) omarchy-cmd-screenrecord output ;;
*) back_to show_capture_menu ;; *) back_to show_capture_menu ;;
esac esac
} }