1{pkgs, lib, config, ...}:
2
3with lib;
4let
5 inherit (lib) mkOption mkIf optionals literalExample;
6 cfg = config.services.xserver.windowManager.xmonad;
7 xmonad = pkgs.xmonad-with-packages.override {
8 ghcWithPackages = cfg.haskellPackages.ghcWithPackages;
9 packages = self: cfg.extraPackages self ++
10 optionals cfg.enableContribAndExtras
11 [ self.xmonad-contrib self.xmonad-extras ];
12 };
13in
14{
15 options = {
16 services.xserver.windowManager.xmonad = {
17 enable = mkEnableOption "xmonad";
18 haskellPackages = mkOption {
19 default = pkgs.haskellPackages;
20 defaultText = "pkgs.haskellPackages";
21 example = literalExample "pkgs.haskell.packages.ghc784";
22 description = ''
23 haskellPackages used to build Xmonad and other packages.
24 This can be used to change the GHC version used to build
25 Xmonad and the packages listed in
26 <varname>extraPackages</varname>.
27 '';
28 };
29
30 extraPackages = mkOption {
31 default = self: [];
32 example = literalExample ''
33 haskellPackages: [
34 haskellPackages.xmonad-contrib
35 haskellPackages.monad-logger
36 ]
37 '';
38 description = ''
39 Extra packages available to ghc when rebuilding Xmonad. The
40 value must be a function which receives the attrset defined
41 in <varname>haskellPackages</varname> as the sole argument.
42 '';
43 };
44
45 enableContribAndExtras = mkOption {
46 default = false;
47 example = true;
48 type = lib.types.bool;
49 description = "Enable xmonad-{contrib,extras} in Xmonad.";
50 };
51 };
52 };
53 config = mkIf cfg.enable {
54 services.xserver.windowManager = {
55 session = [{
56 name = "xmonad";
57 start = ''
58 ${xmonad}/bin/xmonad &
59 waitPID=$!
60 '';
61 }];
62 };
63
64 environment.systemPackages = [ xmonad ];
65 };
66}