mirror of
https://github.com/nix-community/home-manager
synced 2024-12-24 18:59:47 +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:
parent
7b30fc9922
commit
c1761366b5
1 changed files with 71 additions and 12 deletions
|
@ -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;
|
||||||
|
}
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue