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}