summary refs log tree commit diff
path: root/nixos/modules
diff options
context:
space:
mode:
Diffstat (limited to 'nixos/modules')
-rw-r--r--nixos/modules/services/x11/window-managers/xmonad.nix55
1 files changed, 47 insertions, 8 deletions
diff --git a/nixos/modules/services/x11/window-managers/xmonad.nix b/nixos/modules/services/x11/window-managers/xmonad.nix
index 2cbb5002d6cf..87eff38a028a 100644
--- a/nixos/modules/services/x11/window-managers/xmonad.nix
+++ b/nixos/modules/services/x11/window-managers/xmonad.nix
@@ -1,10 +1,14 @@
 {pkgs, config, ...}:
 
 let
-  inherit (pkgs.lib) mkOption mkIf;
+  inherit (pkgs.lib) mkOption mkIf optionals literalExample;
   cfg = config.services.xserver.windowManager.xmonad;
+  xmonadEnv = cfg.haskellPackages.ghcWithPackages(self: [
+    self.xmonad
+  ] ++ optionals cfg.enableContribAndExtras [ self.xmonadContrib self.xmonadExtras]
+    ++ optionals (cfg.extraPackages != null) (cfg.extraPackages self));
+  xmessage = pkgs.xlibs.xmessage;
 in
-
 {
   options = {
     services.xserver.windowManager.xmonad = {
@@ -13,18 +17,53 @@ in
         example = true;
         description = "Enable the xmonad window manager.";
       };
+
+      haskellPackages = mkOption {
+        default = pkgs.haskellPackages;
+        defaultText = "pkgs.haskellPackages";
+        example = literalExample "pkgs.haskellPackages_ghc701";
+        description = ''
+          haskellPackages used to build Xmonad and other packages.
+          This can be used to change the GHC version used to build
+          Xmonad and the packages listed in
+          <varname>extraPackages</varname>.
+        '';
+      };
+
+      extraPackages = mkOption {
+        default = null;
+        example = literalExample ''
+          haskellPackages: [
+            haskellPackages.xmonadContrib
+            haskellPackages.monadLogger
+          ]
+        '';
+        description = ''
+          Extra packages available to ghc when rebuilding Xmonad. The
+          value must be a function which receives the attrset defined
+          in <varname>haskellpackages</varname> as the sole argument.
+        '';
+      };
+
+      enableContribAndExtras = mkOption {
+        default = false;
+        example = true;
+        type = pkgs.lib.types.bool;
+        description = "Enable xmonad-{contrib,extras} in Xmonad.";
+      };
     };
   };
-
-  config = {
+  config = mkIf cfg.enable {
     services.xserver.windowManager = {
-      session = mkIf cfg.enable [{
+      session = [{
         name = "xmonad";
-        start = "
-          ${pkgs.haskellPackages.xmonad}/bin/xmonad &
+        start = ''
+          XMONAD_GHC=${xmonadEnv}/bin/ghc XMONAD_XMESSAGE=${xmessage}/bin/xmessage xmonad &
           waitPID=$!
-        ";
+        '';
       }];
     };
+
+    environment.systemPackages = [ cfg.haskellPackages.xmonad ];
   };
 }