From c1761366b522595ff0dda47d7ba79d5242ecb31e Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Fri, 29 Jan 2021 23:13:01 +0100 Subject: [PATCH] xmonad: add libFiles option and build type compilation The `libFiles` option allows Home Manager to manage additional files for xmonad. Also compile xmonad during configuration build time. This avoids the need to compile the configuration during activation. --- modules/services/window-managers/xmonad.nix | 83 ++++++++++++++++++--- 1 file changed, 71 insertions(+), 12 deletions(-) diff --git a/modules/services/window-managers/xmonad.nix b/modules/services/window-managers/xmonad.nix index 7be03874..d55693aa 100644 --- a/modules/services/window-managers/xmonad.nix +++ b/modules/services/window-managers/xmonad.nix @@ -75,27 +75,86 @@ in { by Home Manager. ''; }; + + libFiles = mkOption { + type = types.attrsOf (types.oneOf [ types.path ]); + default = { }; + example = literalExample '' + { + "Tools.hs" = pkgs.writeText "Tools.hs" ''' + module Tools where + screenshot = "scrot" + '''; + } + ''; + description = '' + Additional files that will be saved in + ~/.xmonad/lib/ and included in the configuration + build. The keys are the file names while the values are paths to the + contents of the files. + ''; + }; }; }; - config = mkIf cfg.enable (mkMerge [ + config = let + + xmonadBin = "${ + pkgs.runCommandLocal "xmonad-compile" { + nativeBuildInputs = [ xmonad ]; + } '' + mkdir -p $out/bin + + export XMONAD_CONFIG_DIR="$(pwd)/xmonad-config" + export XMONAD_DATA_DIR="$(pwd)/data" + export XMONAD_CACHE_DIR="$(pwd)/cache" + + mkdir -p "$XMONAD_CONFIG_DIR/lib" "$XMONAD_CACHE_DIR" "$XMONAD_DATA_DIR" + + cp ${cfg.config} xmonad-config/xmonad.hs + + declare -A libFiles + libFiles=(${ + concatStringsSep " " + (mapAttrsToList (name: value: "['${name}']='${value}'") + cfg.libFiles) + }) + for key in "''${!libFiles[@]}"; do + cp "''${libFiles[$key]}" "xmonad-config/lib/$key"; + done + + xmonad --recompile + + # The resulting binary name depends on the arch and os + # https://github.com/xmonad/xmonad/blob/56b0f850bc35200ec23f05c079eca8b0a1f90305/src/XMonad/Core.hs#L565-L572 + mv "$XMONAD_DATA_DIR/xmonad-${pkgs.hostPlatform.system}" $out/bin/ + '' + }/bin/xmonad-${pkgs.hostPlatform.system}"; + + in mkIf cfg.enable (mkMerge [ { home.packages = [ (lowPrio xmonad) ]; - xsession.windowManager.command = "${xmonad}/bin/xmonad"; + xsession.windowManager.command = xmonadBin; } (mkIf (cfg.config != null) { home.file.".xmonad/xmonad.hs".source = cfg.config; - home.file.".xmonad/xmonad.hs".onChange = '' - echo "Recompiling xmonad" - $DRY_RUN_CMD ${config.xsession.windowManager.command} --recompile - - # Attempt to restart xmonad if X is running. - if [[ -v DISPLAY ]] ; then - echo "Restarting xmonad" - $DRY_RUN_CMD ${config.xsession.windowManager.command} --restart - fi - ''; + home.file.".xmonad/xmonad-${pkgs.hostPlatform.system}" = { + source = xmonadBin; + onChange = '' + # Attempt to restart xmonad if X is running. + if [[ -v DISPLAY ]] ; then + echo "Restarting xmonad" + $DRY_RUN_CMD ${config.xsession.windowManager.command} --restart + fi + ''; + }; }) + + { + home.file = mapAttrs' (name: value: + attrsets.nameValuePair (".xmonad/lib/" + name) { source = value; }) + cfg.libFiles; + } ]); }