diff options
author | Johannes Frankenau <johannes@frankenau.net> | 2018-08-16 11:00:29 +0200 |
---|---|---|
committer | Johannes Frankenau <johannes@frankenau.net> | 2018-08-16 11:00:29 +0200 |
commit | f9129251ea633ccf94ba4699a3ce5694c2e0c3b9 (patch) | |
tree | e507850da0e4137ffc62797a08b76868e1b1d338 /nixos/modules/services/hardware/triggerhappy.nix | |
parent | 58a2632148e754b3dd52cf74b736b03d8e6a9589 (diff) | |
download | nixlib-f9129251ea633ccf94ba4699a3ce5694c2e0c3b9.tar nixlib-f9129251ea633ccf94ba4699a3ce5694c2e0c3b9.tar.gz nixlib-f9129251ea633ccf94ba4699a3ce5694c2e0c3b9.tar.bz2 nixlib-f9129251ea633ccf94ba4699a3ce5694c2e0c3b9.tar.lz nixlib-f9129251ea633ccf94ba4699a3ce5694c2e0c3b9.tar.xz nixlib-f9129251ea633ccf94ba4699a3ce5694c2e0c3b9.tar.zst nixlib-f9129251ea633ccf94ba4699a3ce5694c2e0c3b9.zip |
nixos/triggerhappy: init
Diffstat (limited to 'nixos/modules/services/hardware/triggerhappy.nix')
-rw-r--r-- | nixos/modules/services/hardware/triggerhappy.nix | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/nixos/modules/services/hardware/triggerhappy.nix b/nixos/modules/services/hardware/triggerhappy.nix new file mode 100644 index 000000000000..81d4a1ae65bf --- /dev/null +++ b/nixos/modules/services/hardware/triggerhappy.nix @@ -0,0 +1,114 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + cfg = config.services.triggerhappy; + + socket = "/run/thd.socket"; + + configFile = pkgs.writeText "triggerhappy.conf" '' + ${concatMapStringsSep "\n" + ({ keys, event, cmd, ... }: + ''${concatMapStringsSep "+" (x: "KEY_" + x) keys} ${toString { press = 1; hold = 2; release = 0; }.${event}} ${cmd}'' + ) + cfg.bindings} + ${cfg.extraConfig} + ''; + + bindingCfg = { config, ... }: { + options = { + + keys = mkOption { + type = types.listOf types.str; + description = "List of keys to match. Key names as defined in linux/input-event-codes.h"; + }; + + event = mkOption { + type = types.enum ["press" "hold" "release"]; + default = "press"; + description = "Event to match."; + }; + + cmd = mkOption { + type = types.str; + description = "What to run."; + }; + + }; + }; + +in + +{ + + ###### interface + + options = { + + services.triggerhappy = { + + enable = mkOption { + type = types.bool; + default = false; + description = '' + Whether to enable the <command>triggerhappy</command> hotkey daemon. + ''; + }; + + bindings = mkOption { + type = types.listOf (types.submodule bindingCfg); + default = []; + example = lib.literalExample '' + [ { keys = ["PLAYPAUSE"]; cmd = "''${pkgs.mpc_cli}/bin/mpc -q toggle"; } ] + ''; + description = '' + Key bindings for <command>triggerhappy</command>. + ''; + }; + + extraConfig = mkOption { + type = types.lines; + default = ""; + description = '' + Literal contents to append to the end of <command>triggerhappy</command> configuration file. + ''; + }; + + }; + + }; + + + ###### implementation + + config = mkIf cfg.enable { + + systemd.sockets.triggerhappy = { + description = "Triggerhappy Socket"; + wantedBy = [ "sockets.target" ]; + socketConfig.ListenDatagram = socket; + }; + + systemd.services.triggerhappy = { + wantedBy = [ "multi-user.target" ]; + after = [ "local-fs.target" ]; + description = "Global hotkey daemon"; + serviceConfig = { + ExecStart = "${pkgs.triggerhappy}/bin/thd --user nobody --socket ${socket} --triggers ${configFile} --deviceglob /dev/input/event*"; + }; + }; + + services.udev.packages = lib.singleton (pkgs.writeTextFile { + name = "triggerhappy-udev-rules"; + destination = "/etc/udev/rules.d/61-triggerhappy.rules"; + text = '' + ACTION=="add", SUBSYSTEM=="input", KERNEL=="event[0-9]*", ATTRS{name}!="triggerhappy", \ + RUN+="${pkgs.triggerhappy}/bin/th-cmd --socket ${socket} --passfd --udev" + ''; + }); + + }; + +} |