1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 cfg = config.services.xserver.windowManager.i3; 7in 8 9{ 10 options.services.xserver.windowManager.i3 = { 11 enable = mkEnableOption (lib.mdDoc "i3 window manager"); 12 13 configFile = mkOption { 14 default = null; 15 type = with types; nullOr path; 16 description = lib.mdDoc '' 17 Path to the i3 configuration file. 18 If left at the default value, $HOME/.i3/config will be used. 19 ''; 20 }; 21 22 extraSessionCommands = mkOption { 23 default = ""; 24 type = types.lines; 25 description = lib.mdDoc '' 26 Shell commands executed just before i3 is started. 27 ''; 28 }; 29 30 package = mkOption { 31 type = types.package; 32 default = pkgs.i3; 33 defaultText = literalExpression "pkgs.i3"; 34 description = lib.mdDoc '' 35 i3 package to use. 36 ''; 37 }; 38 39 extraPackages = mkOption { 40 type = with types; listOf package; 41 default = with pkgs; [ dmenu i3status i3lock ]; 42 defaultText = literalExpression '' 43 with pkgs; [ 44 dmenu 45 i3status 46 i3lock 47 ] 48 ''; 49 description = lib.mdDoc '' 50 Extra packages to be installed system wide. 51 ''; 52 }; 53 }; 54 55 config = mkIf cfg.enable { 56 services.xserver.windowManager.session = [{ 57 name = "i3"; 58 start = '' 59 ${cfg.extraSessionCommands} 60 61 ${cfg.package}/bin/i3 ${optionalString (cfg.configFile != null) 62 "-c /etc/i3/config" 63 } & 64 waitPID=$! 65 ''; 66 }]; 67 environment.systemPackages = [ cfg.package ] ++ cfg.extraPackages; 68 environment.etc."i3/config" = mkIf (cfg.configFile != null) { 69 source = cfg.configFile; 70 }; 71 }; 72 73 imports = [ 74 (mkRemovedOptionModule [ "services" "xserver" "windowManager" "i3-gaps" "enable" ] 75 "i3-gaps was merged into i3. Use services.xserver.windowManager.i3.enable instead.") 76 ]; 77}