{ config, lib, pkgs, util, ... }: # Keybound screen recording: pick a region, then toggle a video-only capture. let # A single key starts and stops recording. # Waybar refreshes on state changes instead of polling. recordingToggle = pkgs.writeShellScript "screen-record-toggle" '' refresh_waybar() { ${lib.getExe' pkgs.procps "pkill"} -RTMIN+10 waybar >/dev/null 2>&1 || true } if ${lib.getExe' pkgs.procps "pgrep"} -x wf-recorder >/dev/null; then ${lib.getExe' pkgs.procps "pkill"} -INT -x wf-recorder exit 0 fi region=$(${lib.getExe pkgs.slurp}) || exit 0 dir="$(${lib.getExe' pkgs.xdg-user-dirs "xdg-user-dir"} VIDEOS)/Recordings" ${lib.getExe' pkgs.coreutils "mkdir"} -p "$dir" file="$dir/recording-$(${lib.getExe' pkgs.coreutils "date"} +%Y%m%d-%H%M%S).mp4" ${lib.getExe' pkgs.libnotify "notify-send"} -a "Screen recording" "Recording started" "Region capture, no audio." ${lib.getExe pkgs.wf-recorder} -g "$region" -f "$file" & recorder=$! refresh_waybar wait "$recorder" || true refresh_waybar ${lib.getExe' pkgs.libnotify "notify-send"} -a "Screen recording" "Recording saved" "$file" ''; # Empty text collapses the widget when recording is idle. recordingStatus = pkgs.writeShellScript "waybar-recording-status" '' if ${lib.getExe' pkgs.procps "pgrep"} -x wf-recorder >/dev/null; then printf '{"text":"${util.glyph "f03d"}","tooltip":"Recording","class":"recording"}\n' else printf '{"text":"","class":"idle"}\n' fi ''; in { options.modules.desktop.utilities.recording.enable = lib.mkEnableOption "wf-recorder screen recording"; config = lib.mkIf config.modules.desktop.utilities.recording.enable { registry.keybind.${config.networking.hostName}.recording-toggle = { keys = "SUPER + SHIFT + R"; action = { kind = "exec"; command = "${recordingToggle}"; }; }; registry.waybar.${config.networking.hostName}."custom/recording" = { order = 10; settings = { return-type = "json"; exec = "${recordingStatus}"; interval = "once"; signal = 10; }; }; }; }