# # 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 ]; }; }; }; }