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 defaultText = "self: []";
33 example = literalExample ''
34 haskellPackages: [
35 haskellPackages.xmonad-contrib
36 haskellPackages.monad-logger
37 ]
38 '';
39 description = ''
40 Extra packages available to ghc when rebuilding Xmonad. The
41 value must be a function which receives the attrset defined
42 in <varname>haskellPackages</varname> as the sole argument.
43 '';
44 };
45
46 enableContribAndExtras = mkOption {
47 default = false;
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}