{ config, lib, pkgs, ... }: let cfg = config.my.home.wm.screen-lock; notificationCmd = let duration = toString (cfg.notify.delay * 1000); notifyCmd = "${lib.getExe pkgs.libnotify} -u critical -t ${duration}"; in # Needs to be surrounded by quotes for systemd to launch it correctly ''"${notifyCmd} -- 'Locking in ${toString cfg.notify.delay} seconds'"''; in { config = lib.mkIf cfg.enable { assertions = [ { assertion = let inherit (cfg) cornerLock notify; bothEnabled = cornerLock.enable && notify.enable; cornerLockHigherThanNotify = cornerLock.delay >= notify.delay; in bothEnabled -> cornerLockHigherThanNotify; message = '' `config.my.home.wm.notify.delay` cannot have a value higher than `config.my.home.wm.cornerLock.delay`. ''; } ]; services.screen-locker = { enable = true; inactiveInterval = cfg.timeout; lockCmd = cfg.command; xautolock = { extraOptions = lib.optionals cfg.cornerLock.enable [ # Mouse corners: instant lock on upper-left, never lock on lower-right "-cornerdelay" "${toString cfg.cornerLock.delay}" "-cornerredelay" "${toString cfg.cornerLock.delay}" "-corners" "+00-" ] ++ lib.optionals cfg.notify.enable [ "-notify" "${toString cfg.notify.delay}" "-notifier" notificationCmd ]; }; }; }; }