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:
parent
7b30fc9922
commit
c1761366b5
|
@ -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;
|
||||
}
|
||||
]);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue