|
|
|
@ -4,111 +4,38 @@ 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 muteEvent volumeDownEvent volumeUpEvent cdPlayEvent cdNextEvent cdPrevEvent]; |
|
|
|
|
|
|
|
|
|
# Called when the power button is pressed. |
|
|
|
|
powerEvent = |
|
|
|
|
{ name = "power-button"; |
|
|
|
|
canonicalHandlers = { |
|
|
|
|
powerEvent = { |
|
|
|
|
event = "button/power.*"; |
|
|
|
|
action = |
|
|
|
|
'' |
|
|
|
|
#! ${pkgs.bash}/bin/sh |
|
|
|
|
${config.services.acpid.powerEventCommands} |
|
|
|
|
''; |
|
|
|
|
action = config.services.acpid.powerEventCommands; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
# Called when the laptop lid is opened/closed. |
|
|
|
|
lidEvent = |
|
|
|
|
{ name = "lid"; |
|
|
|
|
lidEvent = { |
|
|
|
|
event = "button/lid.*"; |
|
|
|
|
action = |
|
|
|
|
'' |
|
|
|
|
#! ${pkgs.bash}/bin/sh |
|
|
|
|
${config.services.acpid.lidEventCommands} |
|
|
|
|
''; |
|
|
|
|
action = config.services.acpid.lidEventCommands; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
# Called when the AC power is connected or disconnected. |
|
|
|
|
acEvent = |
|
|
|
|
{ name = "ac-power"; |
|
|
|
|
acEvent = { |
|
|
|
|
event = "ac_adapter.*"; |
|
|
|
|
action = |
|
|
|
|
'' |
|
|
|
|
#! ${pkgs.bash}/bin/sh |
|
|
|
|
${config.services.acpid.acEventCommands} |
|
|
|
|
''; |
|
|
|
|
action = config.services.acpid.acEventCommands; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
muteEvent = { |
|
|
|
|
name = "mute"; |
|
|
|
|
event = "button/mute.*"; |
|
|
|
|
action = '' |
|
|
|
|
#! ${pkgs.bash}/bin/sh |
|
|
|
|
${config.services.acpid.muteCommands} |
|
|
|
|
''; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
volumeDownEvent = { |
|
|
|
|
name = "volume-down"; |
|
|
|
|
event = "button/volumedown.*"; |
|
|
|
|
action = '' |
|
|
|
|
#! ${pkgs.bash}/bin/sh |
|
|
|
|
${config.services.acpid.volumeDownEventCommands} |
|
|
|
|
''; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
volumeUpEvent = { |
|
|
|
|
name = "volume-up"; |
|
|
|
|
event = "button/volumeup.*"; |
|
|
|
|
action = '' |
|
|
|
|
#! ${pkgs.bash}/bin/sh |
|
|
|
|
${config.services.acpid.volumeUpEventCommands} |
|
|
|
|
''; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
cdPlayEvent = { |
|
|
|
|
name = "cd-play"; |
|
|
|
|
event = "cd/play.*"; |
|
|
|
|
action = '' |
|
|
|
|
#! ${pkgs.bash}/bin/sh |
|
|
|
|
${config.services.acpid.cdPlayEventCommands} |
|
|
|
|
''; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
cdNextEvent = { |
|
|
|
|
name = "cd-next"; |
|
|
|
|
event = "cd/next.*"; |
|
|
|
|
action = '' |
|
|
|
|
#! ${pkgs.bash}/bin/sh |
|
|
|
|
${config.services.acpid.cdNextEventCommands} |
|
|
|
|
''; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
cdPrevEvent = { |
|
|
|
|
name = "cd-prev"; |
|
|
|
|
event = "cd/prev.*"; |
|
|
|
|
action = '' |
|
|
|
|
#! ${pkgs.bash}/bin/sh |
|
|
|
|
${config.services.acpid.cdPrevEventCommands} |
|
|
|
|
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 |
|
|
|
|
|
|
|
|
@ -126,58 +53,45 @@ in |
|
|
|
|
description = "Whether to enable the ACPI daemon."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
powerEventCommands = mkOption { |
|
|
|
|
type = types.lines; |
|
|
|
|
default = ""; |
|
|
|
|
description = "Shell commands to execute on a button/power.* event."; |
|
|
|
|
}; |
|
|
|
|
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."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
lidEventCommands = mkOption { |
|
|
|
|
type = types.lines; |
|
|
|
|
default = ""; |
|
|
|
|
description = "Shell commands to execute on a button/lid.* event."; |
|
|
|
|
}; |
|
|
|
|
action = mkOption { |
|
|
|
|
type = types.lines; |
|
|
|
|
description = "Shell commands to execute when the event is triggered."; |
|
|
|
|
}; |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
acEventCommands = mkOption { |
|
|
|
|
type = types.lines; |
|
|
|
|
default = ""; |
|
|
|
|
description = "Shell commands to execute on an ac_adapter.* event."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
muteCommands = mkOption { |
|
|
|
|
type = types.lines; |
|
|
|
|
default = ""; |
|
|
|
|
description = "Shell commands to execute on an button/mute.* event."; |
|
|
|
|
}; |
|
|
|
|
description = "Event handlers."; |
|
|
|
|
default = {}; |
|
|
|
|
example = { mute = { event = "button/mute.*"; action = "amixer set Master toggle"; }; }; |
|
|
|
|
|
|
|
|
|
volumeDownEventCommands = mkOption { |
|
|
|
|
type = types.lines; |
|
|
|
|
default = ""; |
|
|
|
|
description = "Shell commands to execute on an button/volumedown.* event."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
volumeUpEventCommands = mkOption { |
|
|
|
|
type = types.lines; |
|
|
|
|
default = ""; |
|
|
|
|
description = "Shell commands to execute on an button/volumeup.* event."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
cdPlayEventCommands = mkOption { |
|
|
|
|
powerEventCommands = mkOption { |
|
|
|
|
type = types.lines; |
|
|
|
|
default = ""; |
|
|
|
|
description = "Shell commands to execute on an cd/play.* event."; |
|
|
|
|
description = "Shell commands to execute on a button/power.* event."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
cdNextEventCommands = mkOption { |
|
|
|
|
lidEventCommands = mkOption { |
|
|
|
|
type = types.lines; |
|
|
|
|
default = ""; |
|
|
|
|
description = "Shell commands to execute on an cd/next.* event."; |
|
|
|
|
description = "Shell commands to execute on a button/lid.* event."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
cdPrevEventCommands = mkOption { |
|
|
|
|
acEventCommands = mkOption { |
|
|
|
|
type = types.lines; |
|
|
|
|
default = ""; |
|
|
|
|
description = "Shell commands to execute on an cd/prev.* event."; |
|
|
|
|
description = "Shell commands to execute on an ac_adapter.* event."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
}; |
|
|
|
|