Add a wf-recorder module, enabled by the desktop aggregator. Super+Shift+R picks a region with slurp and toggles a video-only capture (no audio), stopped with SIGINT so the file finalises, saved to ~/Videos/Recordings. Start and saved notifications fire via notify-send. A Waybar custom/recording widget samples the wf-recorder process once a second and shows a video glyph while a capture runs.
55 lines
1.7 KiB
Nix
55 lines
1.7 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}:
|
|
# Keybound screen recording: pick a region, then toggle a video-only capture.
|
|
let
|
|
cfg = config.modules.desktop.recording;
|
|
user = config.user.name;
|
|
|
|
slurp = "${pkgs.slurp}/bin/slurp";
|
|
wf-recorder = "${pkgs.wf-recorder}/bin/wf-recorder";
|
|
notify-send = "${pkgs.libnotify}/bin/notify-send";
|
|
pgrep = "${pkgs.procps}/bin/pgrep";
|
|
pkill = "${pkgs.procps}/bin/pkill";
|
|
date = "${pkgs.coreutils}/bin/date";
|
|
mkdir = "${pkgs.coreutils}/bin/mkdir";
|
|
|
|
recDir = "$HOME/Videos/Recordings";
|
|
|
|
# A single key both starts and stops.
|
|
# A running wf-recorder is stopped with SIGINT so it finalises the file.
|
|
# Otherwise slurp picks a region and wf-recorder runs in the foreground until
|
|
# that stop arrives, so this instance lives for the whole recording and then
|
|
# reports it saved.
|
|
# No -a means no audio is captured.
|
|
toggle = pkgs.writeShellScript "screen-record-toggle" ''
|
|
if ${pgrep} -x wf-recorder >/dev/null; then
|
|
${pkill} -INT -x wf-recorder
|
|
exit 0
|
|
fi
|
|
|
|
region=$(${slurp}) || exit 0
|
|
${mkdir} -p "${recDir}"
|
|
file="${recDir}/recording-$(${date} +%Y%m%d-%H%M%S).mp4"
|
|
|
|
${notify-send} -a "Screen recording" "Recording started" "Region capture, no audio."
|
|
${wf-recorder} -g "$region" -f "$file"
|
|
${notify-send} -a "Screen recording" "Recording saved" "$file"
|
|
'';
|
|
in
|
|
{
|
|
options.modules.desktop.recording.enable = lib.mkEnableOption "wf-recorder screen recording";
|
|
|
|
config = lib.mkIf cfg.enable {
|
|
home-manager.users.${user} = {
|
|
# $mod is defined by the compositor config these binds share.
|
|
wayland.windowManager.hyprland.settings.bind = [
|
|
"$mod SHIFT, R, exec, ${toggle}"
|
|
];
|
|
};
|
|
};
|
|
}
|