120 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ config, lib, pkgs, ... }:
 | 
						|
 | 
						|
with lib;
 | 
						|
 | 
						|
let
 | 
						|
 | 
						|
  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 = event:
 | 
						|
          ''
 | 
						|
            fn=$out/${event.name}
 | 
						|
            echo "event=${event.event}" > $fn
 | 
						|
            echo "action=${pkgs.writeScript "${event.name}.sh" event.action}" >> $fn
 | 
						|
          '';
 | 
						|
        in lib.concatMapStrings f events
 | 
						|
      }
 | 
						|
    '';
 | 
						|
 | 
						|
  events = [powerEvent lidEvent acEvent];
 | 
						|
 | 
						|
  # Called when the power button is pressed.
 | 
						|
  powerEvent =
 | 
						|
    { name = "power-button";
 | 
						|
      event = "button/power.*";
 | 
						|
      action =
 | 
						|
        ''
 | 
						|
          #! ${pkgs.bash}/bin/sh
 | 
						|
          ${config.services.acpid.powerEventCommands}
 | 
						|
        '';
 | 
						|
    };
 | 
						|
 | 
						|
  # Called when the laptop lid is opened/closed.
 | 
						|
  lidEvent =
 | 
						|
    { name = "lid";
 | 
						|
      event = "button/lid.*";
 | 
						|
      action =
 | 
						|
        ''
 | 
						|
          #! ${pkgs.bash}/bin/sh
 | 
						|
          ${config.services.acpid.lidEventCommands}
 | 
						|
        '';
 | 
						|
    };
 | 
						|
 | 
						|
  # Called when the AC power is connected or disconnected.
 | 
						|
  acEvent =
 | 
						|
    { name = "ac-power";
 | 
						|
      event = "ac_adapter.*";
 | 
						|
      action =
 | 
						|
        ''
 | 
						|
          #! ${pkgs.bash}/bin/sh
 | 
						|
          ${config.services.acpid.acEventCommands}
 | 
						|
        '';
 | 
						|
    };
 | 
						|
 | 
						|
in
 | 
						|
 | 
						|
{
 | 
						|
 | 
						|
  ###### interface
 | 
						|
 | 
						|
  options = {
 | 
						|
 | 
						|
    services.acpid = {
 | 
						|
 | 
						|
      enable = mkOption {
 | 
						|
        type = types.bool;
 | 
						|
        default = false;
 | 
						|
        description = "Whether to enable the ACPI daemon.";
 | 
						|
      };
 | 
						|
 | 
						|
      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 {
 | 
						|
 | 
						|
    jobs.acpid =
 | 
						|
      { description = "ACPI Daemon";
 | 
						|
 | 
						|
        wantedBy = [ "multi-user.target" ];
 | 
						|
        after = [ "systemd-udev-settle.service" ];
 | 
						|
 | 
						|
        path = [ pkgs.acpid ];
 | 
						|
 | 
						|
        daemonType = "fork";
 | 
						|
 | 
						|
        exec = "acpid --confdir ${acpiConfDir}";
 | 
						|
 | 
						|
        unitConfig.ConditionVirtualization = "!systemd-nspawn";
 | 
						|
        unitConfig.ConditionPathExists = [ "/proc/acpi" ];
 | 
						|
      };
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
}
 |