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
1 changed files with 71 additions and 12 deletions

View File

@ -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
<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) ];
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;
}
]);
}