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