nixos/xss-lock: add module (#40619)

`xsslock` (which was originally packaged in 6cb1d1aaaf02a72329bedf9c6960e54fea6f5c6e)
is a simple screensaver which connects a given screen locker (e.g.
`i3lock`) with `logind`. Whenever `loginctl lock-sessions` is invoked
the locker will be used to lock the screen. This works with its power
management features (e.g. `lid switch`) as well, so the PC can be locked
automatically when the lid is closed.

The module can be used like this:

```
{
services.xserver.enable = true;

programs.xss-lock.enable = true;
programs.xss-lock.lockerCommand = "i3lock";
}
```

Changed files
+53
nixos
+1
nixos/modules/module-list.nix
···
./programs/wireshark.nix
./programs/xfs_quota.nix
./programs/xonsh.nix
+
./programs/xss-lock.nix
./programs/yabar.nix
./programs/zsh/oh-my-zsh.nix
./programs/zsh/zsh.nix
+26
nixos/modules/programs/xss-lock.nix
···
+
{ config, pkgs, lib, ... }:
+
+
with lib;
+
+
let
+
cfg = config.programs.xss-lock;
+
in
+
{
+
options.programs.xss-lock = {
+
enable = mkEnableOption "xss-lock";
+
lockerCommand = mkOption {
+
example = "xlock";
+
type = types.string;
+
description = "Locker to be used with xsslock";
+
};
+
};
+
+
config = mkIf cfg.enable {
+
systemd.user.services.xss-lock = {
+
description = "XSS Lock Daemon";
+
wantedBy = [ "graphical-session.target" ];
+
partOf = [ "graphical-session.target" ];
+
serviceConfig.ExecStart = "${pkgs.xss-lock}/bin/xss-lock ${cfg.lockerCommand}";
+
};
+
};
+
}
+1
nixos/release.nix
···
tests.xfce = callTest tests/xfce.nix {};
tests.xmonad = callTest tests/xmonad.nix {};
tests.xrdp = callTest tests/xrdp.nix {};
+
tests.xss-lock = callTest tests/xss-lock.nix {};
tests.yabar = callTest tests/yabar.nix {};
tests.zookeeper = callTest tests/zookeeper.nix {};
+25
nixos/tests/xss-lock.nix
···
+
import ./make-test.nix ({ pkgs, lib, ... }:
+
+
with lib;
+
+
{
+
name = "xss-lock";
+
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ ma27 ];
+
+
machine = {
+
imports = [ ./common/x11.nix ./common/user-account.nix ];
+
programs.xss-lock.enable = true;
+
programs.xss-lock.lockerCommand = "${pkgs.xlockmore}/bin/xlock";
+
services.xserver.displayManager.auto.user = "alice";
+
};
+
+
testScript = ''
+
$machine->start;
+
$machine->waitForX;
+
$machine->waitForUnit("xss-lock.service", "alice");
+
+
$machine->fail("pgrep xlock");
+
$machine->succeed("su -l alice -c 'xset dpms force standby'");
+
$machine->succeed("pgrep xlock");
+
'';
+
})