{ config, lib, pkgs, ... }: with lib; let cfg = config.services.screen-locker; in { options.services.screen-locker = { enable = mkEnableOption "screen locker for X session"; lockCmd = mkOption { type = types.str; description = "Locker command to run."; example = "\${pkgs.i3lock}/bin/i3lock -n -c 000000"; }; enableDetectSleep = mkOption { type = types.bool; default = true; description = '' Whether to reset timers when awaking from sleep. ''; }; inactiveInterval = mkOption { type = types.int; default = 10; description = '' Inactive time interval in minutes after which session will be locked. The minimum is 1 minute, and the maximum is 1 hour. See . ''; }; xautolockExtraOptions = mkOption { type = types.listOf types.str; default = [ ]; description = '' Extra command-line arguments to pass to xautolock. ''; }; xssLockExtraOptions = mkOption { type = types.listOf types.str; default = [ ]; description = '' Extra command-line arguments to pass to xss-lock. ''; }; }; config = mkIf cfg.enable { systemd.user.services.xautolock-session = { Unit = { Description = "xautolock, session locker service"; After = [ "graphical-session-pre.target" ]; PartOf = [ "graphical-session.target" ]; }; Install = { WantedBy = [ "graphical-session.target" ]; }; Service = { ExecStart = concatStringsSep " " ([ "${pkgs.xautolock}/bin/xautolock" "-time ${toString cfg.inactiveInterval}" "-locker '${pkgs.systemd}/bin/loginctl lock-session $XDG_SESSION_ID'" ] ++ optional cfg.enableDetectSleep "-detectsleep" ++ cfg.xautolockExtraOptions); }; }; systemd.user.services.xss-lock = { Unit = { Description = "xss-lock, session locker service"; After = [ "graphical-session-pre.target" ]; PartOf = [ "graphical-session.target" ]; }; Install = { WantedBy = [ "graphical-session.target" ]; }; Service = { ExecStart = concatStringsSep " " ([ "${pkgs.xss-lock}/bin/xss-lock" "-s \${XDG_SESSION_ID}" ] ++ cfg.xssLockExtraOptions ++ [ "-- ${cfg.lockCmd}" ]); }; }; }; }