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 "i3 window manager"; 12 13 configFile = mkOption { 14 default = null; 15 type = with types; nullOr path; 16 description = '' 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 = '' 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 = "pkgs.i3"; 34 example = "pkgs.i3-gaps"; 35 description = '' 36 i3 package to use. 37 ''; 38 }; 39 40 extraPackages = mkOption { 41 type = with types; listOf package; 42 default = with pkgs; [ dmenu i3status i3lock ]; 43 example = literalExample '' 44 with pkgs; [ 45 dmenu 46 i3status 47 i3lock 48 ] 49 ''; 50 description = '' 51 Extra packages to be installed system wide. 52 ''; 53 }; 54 }; 55 56 config = mkIf cfg.enable { 57 services.xserver.windowManager.session = [{ 58 name = "i3"; 59 start = '' 60 ${cfg.extraSessionCommands} 61 62 ${cfg.package}/bin/i3 ${optionalString (cfg.configFile != null) 63 "-c \"${cfg.configFile}\"" 64 } & 65 waitPID=$! 66 ''; 67 }]; 68 environment.systemPackages = [ cfg.package ] ++ cfg.extraPackages; 69 }; 70 71 imports = [ 72 (mkRemovedOptionModule [ "services" "xserver" "windowManager" "i3-gaps" "enable" ] 73 "Use services.xserver.windowManager.i3.enable and set services.xserver.windowManager.i3.package to pkgs.i3-gaps to use i3-gaps.") 74 ]; 75}