129 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { config, lib, pkgs, ... }:
 | |
| 
 | |
| with lib;
 | |
| 
 | |
| let
 | |
| 
 | |
|   canonicalHandlers = {
 | |
|     powerEvent = {
 | |
|       event = "button/power.*";
 | |
|       action = config.services.acpid.powerEventCommands;
 | |
|     };
 | |
| 
 | |
|     lidEvent = {
 | |
|       event = "button/lid.*";
 | |
|       action = config.services.acpid.lidEventCommands;
 | |
|     };
 | |
| 
 | |
|     acEvent = {
 | |
|       event = "ac_adapter.*";
 | |
|       action = config.services.acpid.acEventCommands;
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   acpiConfDir = pkgs.runCommand "acpi-events" {}
 | |
|     ''
 | |
|       mkdir -p $out
 | |
|       ${
 | |
|         # Generate a configuration file for each event. (You can't have
 | |
|         # multiple events in one config file...)
 | |
|         let f = name: handler:
 | |
|           ''
 | |
|             fn=$out/${name}
 | |
|             echo "event=${handler.event}" > $fn
 | |
|             echo "action=${pkgs.writeScript "${name}.sh" (concatStringsSep "\n" [ "#! ${pkgs.bash}/bin/sh" handler.action ])}" >> $fn
 | |
|           '';
 | |
|         in concatStringsSep "\n" (mapAttrsToList f (canonicalHandlers // config.services.acpid.handlers))
 | |
|       }
 | |
|     '';
 | |
| 
 | |
| in
 | |
| 
 | |
| {
 | |
| 
 | |
|   ###### interface
 | |
| 
 | |
|   options = {
 | |
| 
 | |
|     services.acpid = {
 | |
| 
 | |
|       enable = mkOption {
 | |
|         type = types.bool;
 | |
|         default = false;
 | |
|         description = "Whether to enable the ACPI daemon.";
 | |
|       };
 | |
| 
 | |
|       handlers = mkOption {
 | |
|         type = types.attrsOf (types.submodule {
 | |
|           options = {
 | |
|             event = mkOption {
 | |
|               type = types.str;
 | |
|               example = [ "button/power.*" "button/lid.*" "ac_adapter.*" "button/mute.*" "button/volumedown.*" "cd/play.*" "cd/next.*" ];
 | |
|               description = "Event type.";
 | |
|             };
 | |
| 
 | |
|             action = mkOption {
 | |
|               type = types.lines;
 | |
|               description = "Shell commands to execute when the event is triggered.";
 | |
|             };
 | |
|           };
 | |
|         });
 | |
| 
 | |
|         description = "Event handlers.";
 | |
|         default = {};
 | |
|         example = { mute = { event = "button/mute.*"; action = "amixer set Master toggle"; }; };
 | |
| 
 | |
| 
 | |
|       };
 | |
| 
 | |
|       powerEventCommands = mkOption {
 | |
|         type = types.lines;
 | |
|         default = "";
 | |
|         description = "Shell commands to execute on a button/power.* event.";
 | |
|       };
 | |
| 
 | |
|       lidEventCommands = mkOption {
 | |
|         type = types.lines;
 | |
|         default = "";
 | |
|         description = "Shell commands to execute on a button/lid.* event.";
 | |
|       };
 | |
| 
 | |
|       acEventCommands = mkOption {
 | |
|         type = types.lines;
 | |
|         default = "";
 | |
|         description = "Shell commands to execute on an ac_adapter.* event.";
 | |
|       };
 | |
| 
 | |
|     };
 | |
| 
 | |
|   };
 | |
| 
 | |
| 
 | |
|   ###### implementation
 | |
| 
 | |
|   config = mkIf config.services.acpid.enable {
 | |
| 
 | |
|     systemd.services.acpid = {
 | |
|       description = "ACPI Daemon";
 | |
| 
 | |
|       wantedBy = [ "multi-user.target" ];
 | |
|       after = [ "systemd-udev-settle.service" ];
 | |
| 
 | |
|       path = [ pkgs.acpid ];
 | |
| 
 | |
|       serviceConfig = {
 | |
|         Type = "forking";
 | |
|       };
 | |
| 
 | |
|       unitConfig = {
 | |
|         ConditionVirtualization = "!systemd-nspawn";
 | |
|         ConditionPathExists = [ "/proc/acpi" ];
 | |
|       };
 | |
| 
 | |
|       script = "acpid --confdir ${acpiConfDir}";
 | |
|     };
 | |
| 
 | |
|   };
 | |
| 
 | |
| }
 | 
