From 128a6125a92d7de6b117b6fd7234b804a5ff1a41 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 14 Nov 2025 13:42:24 +0100 Subject: [PATCH] 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 --- bin/omarchy-cmd-screenrecord | 70 ++++++++++++------------------------ bin/omarchy-menu | 10 +++--- 2 files changed, 26 insertions(+), 54 deletions(-) diff --git a/bin/omarchy-cmd-screenrecord b/bin/omarchy-cmd-screenrecord index 49194eec..2cc60f8a 100755 --- a/bin/omarchy-cmd-screenrecord +++ b/bin/omarchy-cmd-screenrecord @@ -8,15 +8,15 @@ if [[ ! -d "$OUTPUT_DIR" ]]; then exit 1 fi -SCOPE="" -AUDIO="false" +DESKTOP_AUDIO="false" +MICROPHONE_AUDIO="false" WEBCAM="false" for arg in "$@"; do case "$arg" in - --with-audio) AUDIO="true" ;; + --with-desktop-audio) DESKTOP_AUDIO="true" ;; + --with-microphone-audio) MICROPHONE_AUDIO="true" ;; --with-webcam) WEBCAM="true" ;; - output|region) SCOPE="$arg" ;; esac done @@ -57,27 +57,35 @@ start_webcam_overlay() { start_screenrecording() { local filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4" + local audio_devices="" local audio_args="" - # Merge audio tracks into one - separate tracks only play one at a time in most players - [[ "$AUDIO" == "true" ]] && audio_args="-a default_output|default_input" + [[ "$DESKTOP_AUDIO" == "true" ]] && audio_devices+="default_output" - 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 } 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 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 count=$((count + 1)) done - if pgrep -f "gpu-screen-recorder" >/dev/null; then - pkill -9 -f "gpu-screen-recorder" + 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 @@ -92,51 +100,17 @@ toggle_screenrecording_indicator() { } 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 pgrep -x slurp >/dev/null; then - pkill -x slurp 2>/dev/null - elif pgrep -f "WebcamOverlay" >/dev/null && ! pgrep -f "gpu-screen-recorder" >/dev/null; then + if pgrep -f "WebcamOverlay" >/dev/null && ! pgrep -f "^gpu-screen-recorder" >/dev/null; then cleanup_webcam else stop_screenrecording 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 [[ "$WEBCAM" == "true" ]] && start_webcam_overlay - scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .scale') - - 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" + start_screenrecording || cleanup_webcam fi diff --git a/bin/omarchy-menu b/bin/omarchy-menu index dc5e718f..f82f140f 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -112,12 +112,10 @@ show_screenshot_menu() { } show_screenrecord_menu() { - case $(menu "Screenrecord" " Region\n Region + Audio\n Display\n Display + Audio\n Display + Webcam") in - *"Region + Audio"*) omarchy-cmd-screenrecord region --with-audio ;; - *Region*) omarchy-cmd-screenrecord ;; - *"Display + Audio"*) omarchy-cmd-screenrecord output --with-audio ;; - *"Display + Webcam"*) omarchy-cmd-screenrecord output --with-audio --with-webcam ;; - *Display*) omarchy-cmd-screenrecord output ;; + case $(menu "Screenrecord" " With desktop audio\n With desktop + microphone audio\n With desktop + microphone audio + webcam") in + *"With desktop audio"*) omarchy-cmd-screenrecord --with-desktop-audio ;; + *"With desktop + microphone audio"*) omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio ;; + *"With desktop + microphone audio + webcam"*) omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio --with-webcam ;; *) back_to show_capture_menu ;; esac }