From 7ffc11106acfb03794bc3e7ef228bf9264ff404f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9ana=20=E6=B1=9F?= Date: Tue, 21 Oct 2025 21:13:42 +0800 Subject: [PATCH] nixos/xscreensaver: add service to handle events --- nix/nixosModules/common/xscreensaver.nix | 48 ++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 nix/nixosModules/common/xscreensaver.nix diff --git a/nix/nixosModules/common/xscreensaver.nix b/nix/nixosModules/common/xscreensaver.nix new file mode 100644 index 00000000..2359f830 --- /dev/null +++ b/nix/nixosModules/common/xscreensaver.nix @@ -0,0 +1,48 @@ +# +# 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 + case $event in + ${handlers} + esac + done + ''; + path = [ + cfg.package # contains xscreensaver-command + ]; + }; + }; + }; +}