1
0
Fork 0
mirror of https://github.com/nix-community/home-manager synced 2024-12-24 10:49:48 +01:00

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.
This commit is contained in:
Markus Scherer 2021-01-29 23:13:01 +01:00 committed by Robert Helgesson
parent 7b30fc9922
commit c1761366b5
No known key found for this signature in database
GPG key ID: 36BDAA14C2797E89

View file

@ -75,27 +75,86 @@ in {
by Home Manager. 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
<filename>~/.xmonad/lib/</filename> 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) ]; home.packages = [ (lowPrio xmonad) ];
xsession.windowManager.command = "${xmonad}/bin/xmonad"; xsession.windowManager.command = xmonadBin;
} }
(mkIf (cfg.config != null) { (mkIf (cfg.config != null) {
home.file.".xmonad/xmonad.hs".source = cfg.config; home.file.".xmonad/xmonad.hs".source = cfg.config;
home.file.".xmonad/xmonad.hs".onChange = '' home.file.".xmonad/xmonad-${pkgs.hostPlatform.system}" = {
echo "Recompiling xmonad" source = xmonadBin;
$DRY_RUN_CMD ${config.xsession.windowManager.command} --recompile onChange = ''
# Attempt to restart xmonad if X is running. # Attempt to restart xmonad if X is running.
if [[ -v DISPLAY ]] ; then if [[ -v DISPLAY ]] ; then
echo "Restarting xmonad" echo "Restarting xmonad"
$DRY_RUN_CMD ${config.xsession.windowManager.command} --restart $DRY_RUN_CMD ${config.xsession.windowManager.command} --restart
fi fi
''; '';
};
}) })
{
home.file = mapAttrs' (name: value:
attrsets.nameValuePair (".xmonad/lib/" + name) { source = value; })
cfg.libFiles;
}
]); ]);
} }