diff options
| author | Daiderd Jordan <daiderd@gmail.com> | 2020-05-13 19:24:31 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-13 19:24:31 +0200 |
| commit | c5f7cee0edff41b235c81f94c4e846a87e62002e (patch) | |
| tree | 4e18e64dab15f65a29da2d981069ad236f8ca1da /modules | |
| parent | 64a4bc854e7ac404a77224b03485284df56b0d75 (diff) | |
| parent | 7ef533e8d1fb6ece563232b326fc5b5d5c2f9257 (diff) | |
Merge pull request #196 from cmacrae/modules/services/yabai
module: add yabai service
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/module-list.nix | 1 | ||||
| -rw-r--r-- | modules/services/yabai/default.nix | 103 |
2 files changed, 104 insertions, 0 deletions
diff --git a/modules/module-list.nix b/modules/module-list.nix index ae5cf69..bbe8e67 100644 --- a/modules/module-list.nix +++ b/modules/module-list.nix @@ -53,6 +53,7 @@ ./services/skhd ./services/synapse-bt.nix ./services/synergy + ./services/yabai ./programs/bash ./programs/fish.nix ./programs/gnupg.nix diff --git a/modules/services/yabai/default.nix b/modules/services/yabai/default.nix new file mode 100644 index 0000000..9318ff9 --- /dev/null +++ b/modules/services/yabai/default.nix @@ -0,0 +1,103 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.services.yabai; + + toYabaiConfig = opts: + concatStringsSep "\n" (mapAttrsToList + (p: v: "yabai -m config ${p} ${toString v}") opts); + + configFile = mkIf (cfg.config != {} || cfg.extraConfig != "") + "${pkgs.writeScript "yabairc" ( + (if (cfg.config != {}) + then "${toYabaiConfig cfg.config}" + else "") + + optionalString (cfg.extraConfig != "") cfg.extraConfig)}"; +in + +{ + options = with types; { + services.yabai.enable = mkOption { + type = bool; + default = false; + description = "Whether to enable the yabai window manager."; + }; + + services.yabai.package = mkOption { + type = path; + description = "The yabai package to use."; + }; + + services.yabai.enableScriptingAddition = mkOption { + type = bool; + default = false; + description = '' + Whether to enable yabai's scripting-addition. + SIP must be disabled for this to work. + ''; + }; + + services.yabai.config = mkOption { + type = attrs; + default = {}; + example = literalExample '' + { + focus_follows_mouse = "autoraise"; + mouse_follows_focus = "off"; + window_placement = "second_child"; + window_opacity = "off"; + top_padding = 36; + bottom_padding = 10; + left_padding = 10; + right_padding = 10; + window_gap = 10; + } + ''; + description = '' + Key/Value pairs to pass to yabai's 'config' domain, via the configuration file. + ''; + }; + + services.yabai.extraConfig = mkOption { + type = str; + default = ""; + example = literalExample '' + yabai -m rule --add app='System Preferences' manage=off + ''; + description = "Extra arbitrary configuration to append to the configuration file"; + }; + }; + + config = mkMerge [ + (mkIf (cfg.enable) { + environment.systemPackages = [ cfg.package ]; + + launchd.user.agents.yabai = { + serviceConfig.ProgramArguments = [ "${cfg.package}/bin/yabai" ] + ++ optionals (cfg.config != {} || cfg.extraConfig != "") [ "-c" configFile ]; + + serviceConfig.KeepAlive = true; + serviceConfig.RunAtLoad = true; + serviceConfig.EnvironmentVariables = { + PATH = "${cfg.package}/bin:${config.environment.systemPath}"; + }; + }; + }) + + # TODO: [@cmacrae] Handle removal of yabai scripting additions + (mkIf (cfg.enableScriptingAddition) { + launchd.daemons.yabai-sa = { + script = '' + if [ ! $(${cfg.package}/bin/yabai --check-sa) ]; then + ${cfg.package}/bin/yabai --install-sa + fi + ''; + + serviceConfig.RunAtLoad = true; + serviceConfig.KeepAlive.SuccessfulExit = false; + }; + }) + ]; +} |
