{ 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'"; })); }; }