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