diff options
author | aszlig <aszlig@redmoonstudios.org> | 2014-07-14 22:47:14 +0200 |
---|---|---|
committer | aszlig <aszlig@redmoonstudios.org> | 2014-07-14 22:47:14 +0200 |
commit | 1018cd7cc704f08e3329cb758a73e6da98d4e087 (patch) | |
tree | 7ee1659af7cce5cbd5d0f6c0236b10fac3edb87c /modules/i3/workspace.nix | |
parent | c65f5ba3a7eb43e01f098d63f8d22cdc1e78d8bd (diff) |
i3: Add NixOS options to configure workspaces.
This allows for a more dynamic workspace assignments, especially when varying between the number of heads. We now not only can use the NixOS module system to set workspaces but also assign applications to them. And the default workspace layout is to evenly spread out the heads among the available heads. Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Diffstat (limited to 'modules/i3/workspace.nix')
-rw-r--r-- | modules/i3/workspace.nix | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/modules/i3/workspace.nix b/modules/i3/workspace.nix new file mode 100644 index 00000000..5365bf74 --- /dev/null +++ b/modules/i3/workspace.nix @@ -0,0 +1,106 @@ +{ name, lib, config, ... }: + +with lib; + +let + finalLabel = + if config.label == null then name + else config.labelPrefix + config.label; + + mkDoc = anchor: "http://i3wm.org/docs/userguide.html#${anchor}"; +in +{ + options = { + labelPrefix = mkOption { + type = types.str; + default = ""; + example = "666: "; + description = '' + The value that will be put in front of the <option>label</option>. + So if you have a label called <replaceable>bar</replaceable> and a + <option>labelPrefix</option> called <replaceable>foo</replaceable> the + label for the workspace will be <replaceable>foobar</replaceable>. + ''; + }; + + label = mkOption { + type = types.nullOr types.str; + default = name; + description = '' + The label of this workspace, which is its name by default. If the value + is <replaceable>null</replaceable>, the resulting label of the workspace + is just its name and no <option>labelPrefix</option> is applied. + ''; + }; + + assign = mkOption { + type = types.listOf types.attrs; + default = []; + example = [ + { class = "^Chromium(?:-browser)?\$"; } + { instance = "^gajim\$"; } + ]; + description = let + anchor = "_automatically_putting_clients_on_specific_workspaces"; + in '' + Assign windows to this specific workspace using the attribute names + described by <link xlink:href="${mkDoc anchor}"/>. + ''; + }; + + head = mkOption { + type = types.nullOr types.str; + default = null; + description = '' + The XRandR head this workspace will be assigned to. + ''; + }; + + keys = let + commonDesc = '' + The <replaceable>$mod</replaceable> placeholder represents the default + modifier key. Details about the syntax of key combinations can be found + at <link xlink:href="${mkDoc "keybindings"}"/>. + ''; + in { + switchTo = mkOption { + type = types.nullOr types.str; + default = null; + example = "$mod+1"; + description = '' + Key combination to switch to this workspace. + '' + commonDesc; + }; + + moveTo = mkOption { + type = types.nullOr types.str; + default = null; + example = "$mod+Shift+exclam"; + description = '' + Key combination to move a container to this workspace. + '' + commonDesc; + }; + }; + + config = mkOption { + type = types.lines; + default = ""; + description = '' + Raw configuration options for this workspace. + ''; + }; + }; + + config.config = let + maybeOutput = optionalString (config.head != null) " output ${config.head}"; + mkAssign = mapAttrsToList (criteria: value: "${criteria}=\"${value}\""); + mkSym = sym: rest: optionalString (sym != null) "bindsym ${sym} ${rest}"; + in '' + workspace "${finalLabel}"${maybeOutput} + ${mkSym config.keys.switchTo "workspace \"${finalLabel}\""} + ${mkSym config.keys.moveTo "move workspace \"${finalLabel}\""} + ${concatMapStrings (assign: '' + assign [${concatStringsSep " " (mkAssign assign)}] ${finalLabel} + '') config.assign} + ''; +} |