224 lines
5.9 KiB
Nix
224 lines
5.9 KiB
Nix
{
|
|
__findFile,
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
util,
|
|
...
|
|
}:
|
|
let
|
|
fontName = config.module.style.font.sansSerif.name;
|
|
keyboardLayouts = config.module.keyboard.layouts;
|
|
keyboardOptions = config.module.keyboard.options;
|
|
|
|
alpha = config.module.style.opacity.hex;
|
|
accent = config.module.style.color.accent + alpha;
|
|
border = config.module.style.color.border + alpha;
|
|
borderSize = config.module.style.window.border;
|
|
fg = config.module.style.color.fg.light;
|
|
wallpaper = config.module.wallpaper.path;
|
|
windowGap = config.module.style.window.gap;
|
|
|
|
codec = "libsvtav1";
|
|
color = config.module.style.color;
|
|
container = "mp4";
|
|
format = "%Y-%m-%d_%H-%M-%S";
|
|
framerate = 30;
|
|
opacity = "26";
|
|
pixfmt = "yuv420p10le";
|
|
selection = "slurp -d -b ${color.bg.light}${opacity} -c ${color.fg.light} -w 0 -s 00000000";
|
|
|
|
notifyStart = ''swayscript notify_short'';
|
|
notifyEnd = ''swayscript notify_long'';
|
|
picEdit = ''swappy -f - -o -'';
|
|
picFull = ''-o $(swaymsg -t get_outputs | jq -r ".[] | select(.focused) | .name") -'';
|
|
picPrepFile = prepFile "\${XDG_PICTURES_DIR[0]}" "png";
|
|
picRefLatestFile = refLatestFile "png";
|
|
picSelected = ''-g "''${scrSelection}" -'';
|
|
picToBuffer = ''wl-copy -t image/png'';
|
|
picToFile = ''tee "''${scrFile}"'';
|
|
screenshot = ''grim'';
|
|
updateWaybar = ''{ pkill -RTMIN+4 waybar; } & disown''; # NOTE: Might need to add a delay here if it becomes inconsistent one day.
|
|
vidFull = ''-o $(swaymsg -t get_outputs | jq -r ".[] | select(.focused) | .name") -'';
|
|
vidPrepFile = prepFile "\${XDG_VIDEOS_DIR[0]}" container;
|
|
vidRefLatestFile = refLatestFile container;
|
|
vidSelected = ''--geometry "''${scrSelection}"'';
|
|
vidStop = ''pkill -SIGINT wf-recorder'';
|
|
|
|
prepFile = path: ext: ''
|
|
# Focused app id by default.
|
|
curWindow=$(parse_snake $(swaymsg -t get_tree | jq '.. | select(.type?) | select(.focused==true) | .app_id'))
|
|
|
|
# If no id (i.e. xwayland), then use a name (title).
|
|
[[ "''${curWindow}" = "null" ]] && curWindow=$(parse_snake $(swaymsg -t get_tree | jq '.. | select(.type?) | select(.focused==true) | .name'))
|
|
|
|
# If no app in focus, use "unknown" dir.
|
|
[[ "''${curWindow}" =~ ^[0-9]+$ ]] && curWindow="unknown"
|
|
|
|
# Prepare dir and file path.
|
|
scrPath="${path}"
|
|
scrDir="${path}/''${curWindow}"
|
|
mkdir -p "''${scrDir}"
|
|
scrName="$(date +${format}).${ext}"
|
|
scrFile="''${scrDir}/''${scrName}"
|
|
scrLatestRef="./''${curWindow}/''${scrName}"
|
|
'';
|
|
|
|
refLatestFile = ext: ''
|
|
scrLatest="''${scrPath}/Latest.${ext}"
|
|
rm "''${scrLatest}"
|
|
ln -s "''${scrLatestRef}" "''${scrLatest}"
|
|
'';
|
|
|
|
getSelection = ''
|
|
scrSelection=$(${selection})
|
|
[[ -n "''${scrSelection}" ]] || exit
|
|
'';
|
|
|
|
getTransform = ''
|
|
scrTransform="$(swaymsg -t get_outputs | jq -r '.[] | select(.focused) | .transform')"
|
|
[[ "''${scrTransform}" = "normal" ]] && scrTransform=""
|
|
'';
|
|
|
|
vidStart = ''
|
|
wf-recorder \
|
|
--no-damage \
|
|
--codec ${codec} \
|
|
--file "''${scrFile}" \
|
|
--framerate ${toString framerate} \
|
|
--pixel-format ${pixfmt} \
|
|
'';
|
|
|
|
vidMuxAudio = ''
|
|
ffmpeg \
|
|
-f lavfi \
|
|
-i anullsrc=channel_layout=stereo:sample_rate=44100 \
|
|
-i "''${scrFile}" \
|
|
-c:v copy \
|
|
-c:a libopus \
|
|
-shortest \
|
|
-f ${container} \
|
|
"''${scrFile}_" \
|
|
&& mv "''${scrFile}_" "''${scrFile}" \
|
|
|| rm "''${scrFile}_"
|
|
'';
|
|
|
|
vidTransform = ''
|
|
if [[ -n "''${scrTransform}" ]]; then
|
|
ffmpeg \
|
|
-display_rotation ''${scrTransform} \
|
|
-i "''${scrFile}" \
|
|
-c copy \
|
|
-f ${container} \
|
|
"''${scrFile}_" \
|
|
&& mv "''${scrFile}_" "''${scrFile}" \
|
|
|| rm "''${scrFile}_"
|
|
fi
|
|
'';
|
|
|
|
SelectRecording = pkgs.writeShellScriptBin "SelectRecording" ''
|
|
${vidStop} || {
|
|
${getSelection}
|
|
${getTransform}
|
|
${vidPrepFile}
|
|
${notifyStart}
|
|
${updateWaybar}
|
|
${vidStart} ${vidSelected}
|
|
${notifyEnd}
|
|
${updateWaybar}
|
|
${vidMuxAudio}
|
|
${vidTransform}
|
|
${vidRefLatestFile}
|
|
};
|
|
'';
|
|
|
|
FullscreenRecording = pkgs.writeShellScriptBin "FullscreenRecording" ''
|
|
${vidStop} || {
|
|
${getTransform}
|
|
${vidPrepFile}
|
|
${notifyStart}
|
|
${updateWaybar}
|
|
${vidStart} ${vidFull}
|
|
${notifyEnd}
|
|
${updateWaybar}
|
|
${vidMuxAudio}
|
|
${vidTransform}
|
|
${vidRefLatestFile}
|
|
};
|
|
'';
|
|
|
|
FullscreenScreenshot = pkgs.writeShellScriptBin "FullscreenScreenshot" ''
|
|
${notifyEnd}
|
|
${picPrepFile}
|
|
|
|
${screenshot} ${picFull} | ${picToFile} | ${picToBuffer}
|
|
${picRefLatestFile}
|
|
'';
|
|
|
|
SelectScreenshot = pkgs.writeShellScriptBin "SelectScreenshot" ''
|
|
${getSelection}
|
|
${notifyStart}
|
|
${picPrepFile}
|
|
|
|
${screenshot} ${picSelected} | ${picEdit} | ${picToFile} | ${picToBuffer}
|
|
${notifyEnd}
|
|
${picRefLatestFile}
|
|
'';
|
|
|
|
swayRcRaw = pkgs.writeText "sway-rc-raw" (
|
|
util.readFiles [
|
|
./module/Mod.conf
|
|
./module/Style.conf
|
|
./module/Display.conf
|
|
./module/Input.conf
|
|
./module/Font.conf
|
|
./module/Launcher.conf
|
|
./module/Terminal.conf
|
|
./module/TitleBar.conf
|
|
./module/Navigation.conf
|
|
./module/Notification.conf
|
|
./module/Resize.conf
|
|
./module/ScratchPad.conf
|
|
./module/Screenshot.conf
|
|
./module/Sound.conf
|
|
./module/Tiling.conf
|
|
./module/Workspace.conf
|
|
./module/Keyd.conf
|
|
./module/Waybar.conf
|
|
./module/System.conf
|
|
./module/Mouse.conf
|
|
]
|
|
);
|
|
|
|
swayRc =
|
|
(pkgs.replaceVars swayRcRaw {
|
|
inherit
|
|
FullscreenRecording
|
|
FullscreenScreenshot
|
|
SelectRecording
|
|
SelectScreenshot
|
|
accent
|
|
border
|
|
borderSize
|
|
fg
|
|
fontName
|
|
keyboardLayouts
|
|
keyboardOptions
|
|
wallpaper
|
|
windowGap
|
|
;
|
|
}).overrideAttrs
|
|
(old: {
|
|
doCheck = false;
|
|
});
|
|
in
|
|
{
|
|
text =
|
|
''
|
|
# Read `man 5 sway` for a complete reference.
|
|
include /etc/sway/config.d/*
|
|
''
|
|
+ builtins.readFile swayRc
|
|
+ lib.concatStringsSep "\n" config.module.sway.extraConfig;
|
|
}
|