From 939a45ff6b9c8432756ca55dcd9451c416948f58 Mon Sep 17 00:00:00 2001 From: Price Hiller Date: Sun, 5 Mar 2023 02:38:31 -0600 Subject: [PATCH] feat(hypr): add capturing gif support to screen-cap.bash --- dots/.config/hypr/scripts/screen-cap.bash | 20 +++++++++++++++----- dots/.config/hypr/wm/bindings.conf | 1 + 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/dots/.config/hypr/scripts/screen-cap.bash b/dots/.config/hypr/scripts/screen-cap.bash index 33053891..8a27ee1e 100755 --- a/dots/.config/hypr/scripts/screen-cap.bash +++ b/dots/.config/hypr/scripts/screen-cap.bash @@ -4,12 +4,14 @@ # - wf-recorder: https://github.com/ammen99/wf-recorder # - notification daemon: https://archlinux.org/packages/?name=notification-daemon # - wl-clipboard: https://github.com/bugaevc/wl-clipboard +# - gifski: https://github.com/sindresorhus/Gifski # # Some of this is hacky because I can't get wf-recorder to nicely output GIFs by itself :( mk-mp4() { local program_name="Screen Capture" local pid_file="/tmp/mk-gif-pid" + local output_type="${1:-MP4}" if [[ -f "${pid_file}" ]]; then notify-send "Saving ${program_name}" "This May Take a Minute" -a "${program_name}" @@ -22,19 +24,27 @@ mk-mp4() { notify-send "Saved ${program_name}" "Successfully Saved Screen Capture to Clipboard" -a "${program_name}" else local input_tmpfile - notify-send "Starting ${program_name}" "Recording GIF of Selected Region" -a "${program_name}" + notify-send "Starting ${program_name}" "Recording ${output_type^^} of Selected Region" -a "${program_name}" ( local tmp_dir tmp_dir="$(mktemp -d)" cd "${tmp_dir}" - input_tmpfile="${tmp_dir}/$(mktemp wf-recorder.XXXXXXXXXXX)" - wf-recorder -g "$(slurp)" -f "${input_tmpfile}.mp4" -c h264_vaapi -d /dev/dri/renderD128 --framerate 24 -- & + input_tmpfile="${tmp_dir}/$(mktemp wf-recorder.XXXXXXXXXXX).mp4" + wf-recorder -g "$(slurp)" -f "${input_tmpfile}" -c h264_vaapi -d /dev/dri/renderD128 -- & printf "%s" $! >"${pid_file}" wait - wl-copy --type video/mp4 <"${input_tmpfile}.mp4" + if [[ "${output_type}" == "gif" ]]; then + local gifski_tmpoutput + pwd + gifski_tmpoutput="${tmp_dir}/$(mktemp gifski.XXXXXXXXXXX).gif" + gifski "${input_tmpfile}" --output "${gifski_tmpoutput}" + wl-copy --type image/gif <"${gifski_tmpoutput}" + else + wl-copy --type video/mp4 <"${input_tmpfile}" + fi rm -f "${pid_file}" ) fi } -mk-mp4 +mk-mp4 "${@}" diff --git a/dots/.config/hypr/wm/bindings.conf b/dots/.config/hypr/wm/bindings.conf index 280058b1..36f70a21 100644 --- a/dots/.config/hypr/wm/bindings.conf +++ b/dots/.config/hypr/wm/bindings.conf @@ -65,6 +65,7 @@ bind=SUPER,A,togglefloating, bind=SUPERSHIFT,Q,exec,swaylock bind=SUPER,S,exec,grim -g "$(slurp)" - | wl-copy --type image/png bind=SUPERSHIFT,S,exec,~/.config/hypr/scripts/screen-cap.bash +bind=SUPERSHIFT,A,exec,~/.config/hypr/scripts/screen-cap.bash gif bind=SUPERSHIFT,M,exit # Mediakey bindings as taken from `wev`