nix-config/_/home-manager/_mixins/common/wayland-wm/swayidle.nix

54 lines
2 KiB
Nix

{ pkgs, lib, config, ... }:
let
swaylock = "${config.programs.swaylock.package}/bin/swaylock";
pgrep = "${pkgs.procps}/bin/pgrep";
pactl = "${pkgs.pulseaudio}/bin/pactl";
hyprctl = "${config.wayland.windowManager.hyprland.package}/bin/hyprctl";
swaymsg = "${config.wayland.windowManager.sway.package}/bin/swaymsg";
isLocked = "${pgrep} -x ${swaylock}";
lockTime = 4 * 60; # TODO: configurable desktop (10 min)/laptop (4 min)
# Makes two timeouts: one for when the screen is not locked (lockTime+timeout) and one for when it is.
afterLockTimeout = { timeout, command, resumeCommand ? null }: [
{ timeout = lockTime + timeout; inherit command resumeCommand; }
{ command = "${isLocked} && ${command}"; inherit resumeCommand timeout; }
];
in
{
services.swayidle = {
enable = true;
systemdTarget = "graphical-session.target";
timeouts =
# Lock screen
[{
timeout = lockTime;
command = "${swaylock} -i ${config.wallpaper} --daemonize";
}] ++
# Mute mic
(afterLockTimeout {
timeout = 10;
command = "${pactl} set-source-mute @DEFAULT_SOURCE@ yes";
resumeCommand = "${pactl} set-source-mute @DEFAULT_SOURCE@ no";
}) ++
# Turn off RGB
(lib.optionals config.services.rgbdaemon.enable (afterLockTimeout {
timeout = 20;
command = "systemctl --user stop rgbdaemon";
resumeCommand = "systemctl --user start rgbdaemon";
})) ++
# Turn off displays (hyprland)
(lib.optionals config.wayland.windowManager.hyprland.enable (afterLockTimeout {
timeout = 40;
command = "${hyprctl} dispatch dpms off";
resumeCommand = "${hyprctl} dispatch dpms on";
})) ++
# Turn off displays (sway)
(lib.optionals config.wayland.windowManager.sway.enable (afterLockTimeout {
timeout = 40;
command = "${swaymsg} 'output * dpms off'";
resumeCommand = "${swaymsg} 'output * dpms on'";
}));
};
}