.files/nix/nixosModules/common/xscreensaver.nix

49 lines
1.2 KiB
Nix

#
# This module provides a service react to xscreensaver events
#
{
config,
lib,
...
}: let
cfg = config.services.xscreensaver;
in {
options = {
services.xscreensaver.hooks = lib.mkOption {
type = with lib.types; attrsOf str;
description = "An attrset of events mapped a block of shell command to be run";
default = {};
};
};
config = lib.mkIf cfg.enable {
systemd.user.services = {
"xscreensaver-hooks" = {
description = "Run commands on xscreensaver events";
after = ["graphical-session.target" "xscreensaver.service"];
partOf = ["graphical-session.target"];
wantedBy = ["graphical-session.target"];
script = let
handlers =
lib.concatMapAttrsStringSep "\n" (event: action: ''
"${event}")
( ${action}
)
;;
'')
cfg.hooks;
in ''
xscreensaver-command -watch | while read event rest; do
echo "The handler script got \"$event\""
case $event in
${handlers}
esac
done
'';
path = [
cfg.package # contains xscreensaver-command
];
};
};
};
}