Advertisement
Guest User

xmonad.nix

a guest
Apr 5th, 2020
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.14 KB | None | 0 0
  1. {pkgs, lib, config, ...}:
  2.  
  3. with lib;
  4. let
  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. };
  13. xmonadBin = pkgs.writers.writeHaskell "xmonad" {
  14. ghc = cfg.haskellPackages.ghc;
  15. libraries = [ cfg.haskellPackages.xmonad ] ++
  16. cfg.extraPackages cfg.haskellPackages ++
  17. optionals cfg.enableContribAndExtras
  18. (with cfg.haskellPackages; [ xmonad-contrib xmonad-extras ]);
  19. } cfg.config;
  20.  
  21. in
  22. {
  23. options = {
  24. services.xserver.windowManager.xmonad = {
  25. enable = mkEnableOption "xmonad";
  26. haskellPackages = mkOption {
  27. default = pkgs.haskellPackages;
  28. defaultText = "pkgs.haskellPackages";
  29. example = literalExample "pkgs.haskell.packages.ghc784";
  30. description = ''
  31. haskellPackages used to build Xmonad and other packages.
  32. This can be used to change the GHC version used to build
  33. Xmonad and the packages listed in
  34. <varname>extraPackages</varname>.
  35. '';
  36. };
  37.  
  38. extraPackages = mkOption {
  39. default = self: [];
  40. defaultText = "self: []";
  41. example = literalExample ''
  42. haskellPackages: [
  43. haskellPackages.xmonad-contrib
  44. haskellPackages.monad-logger
  45. ]
  46. '';
  47. description = ''
  48. Extra packages available to ghc when rebuilding Xmonad. The
  49. value must be a function which receives the attrset defined
  50. in <varname>haskellPackages</varname> as the sole argument.
  51. '';
  52. };
  53.  
  54. enableContribAndExtras = mkOption {
  55. default = false;
  56. type = lib.types.bool;
  57. description = "Enable xmonad-{contrib,extras} in Xmonad.";
  58. };
  59.  
  60. config = mkOption {
  61. default = null;
  62. type = with lib.types; nullOr (either path str);
  63. description = ''
  64. Configuration from which XMonad gets compiled. If no value
  65. is specified, the xmonad config from $HOME/.xmonad is taken.
  66. If you use xmonad --recompile, $HOME/.xmonad will be taken as
  67. the configuration, but on the next restart of display-manager
  68. this config will be reapplied.
  69. '';
  70. example = ''
  71. import XMonad
  72. main = launch defaultConfig
  73. { modMask = mod4Mask -- Use Super instead of Alt
  74. , terminal = "urxvt"
  75. }
  76. '';
  77. };
  78. };
  79. };
  80. config = mkIf cfg.enable {
  81. services.xserver.windowManager = {
  82. session = [{
  83. name = "xmonad";
  84. start = if (cfg.config != null) then ''
  85. ${xmonadBin}
  86. waitPID=$!
  87. '' else ''
  88. systemd-cat -t xmonad ${xmonad}/bin/xmonad &
  89. waitPID=$!
  90. '';
  91. }];
  92. };
  93.  
  94. environment.systemPackages = [ xmonad ];
  95. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement