69 lines
2.1 KiB
Nix
69 lines
2.1 KiB
Nix
{
|
|
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;
|
|
};
|
|
};
|
|
};
|
|
}
|