1
0
Fork 0
mirror of https://github.com/nix-community/home-manager synced 2024-12-29 13:19:47 +01:00
home-manager/modules/services/window-managers/bspwm/options.nix
Naïm Favier e2a85ac43f
bspwm: add alwaysResetDesktops (#2785)
If set to true, desktops configured in `monitors` will be reset every time
the config is run.

If set to false, desktops will only be configured the first time the config is run.
This is useful if you want to dynamically add desktops and you don't want them
to be destroyed if you re-run `bspwmrc`.
2022-03-17 22:56:56 -04:00

230 lines
6.3 KiB
Nix

{ pkgs, lib }:
with lib;
let
rule = types.submodule {
options = {
monitor = mkOption {
type = types.nullOr types.str;
default = null;
description = "The monitor where the rule should be applied.";
example = "HDMI-0";
};
desktop = mkOption {
type = types.nullOr types.str;
default = null;
description = "The desktop where the rule should be applied.";
example = "^8";
};
node = mkOption {
type = types.nullOr types.str;
default = null;
description = "The node where the rule should be applied.";
example = "1";
};
state = mkOption {
type = types.nullOr
(types.enum [ "tiled" "pseudo_tiled" "floating" "fullscreen" ]);
default = null;
description = "The state in which a new window should spawn.";
example = "floating";
};
layer = mkOption {
type = types.nullOr (types.enum [ "below" "normal" "above" ]);
default = null;
description = "The layer where a new window should spawn.";
example = "above";
};
splitDir = mkOption {
type = types.nullOr (types.enum [ "north" "west" "south" "east" ]);
default = null;
description = "The direction where the container is going to be split.";
example = "south";
};
splitRatio = mkOption {
type = types.nullOr types.float;
default = null;
description = ''
The ratio between the new window and the previous existing window in
the desktop.
'';
example = 0.65;
};
hidden = mkOption {
type = types.nullOr types.bool;
default = null;
description = "Whether the node should occupy any space.";
example = true;
};
sticky = mkOption {
type = types.nullOr types.bool;
default = null;
description = "Whether the node should stay on the focused desktop.";
example = true;
};
private = mkOption {
type = types.nullOr types.bool;
default = null;
description = ''
Whether the node should stay in the same tiling position and size.
'';
example = true;
};
locked = mkOption {
type = types.nullOr types.bool;
default = null;
description = ''
Whether the node should ignore <command>node --close</command>
messages.
'';
example = true;
};
marked = mkOption {
type = types.nullOr types.bool;
default = null;
description = "Whether the node will be marked for deferred actions.";
example = true;
};
center = mkOption {
type = types.nullOr types.bool;
default = null;
description = ''
Whether the node will be put in the center, in floating mode.
'';
example = true;
};
follow = mkOption {
type = types.nullOr types.bool;
default = null;
description = "Whether focus should follow the node when it is moved.";
example = true;
};
manage = mkOption {
type = types.nullOr types.bool;
default = null;
description = ''
Whether the window should be managed by bspwm. If false, the window
will be ignored by bspwm entirely. This is useful for overlay apps,
e.g. screenshot tools.
'';
example = true;
};
focus = mkOption {
type = types.nullOr types.bool;
default = null;
description = "Whether the node should gain focus on creation.";
example = true;
};
border = mkOption {
type = types.nullOr types.bool;
default = null;
description = "Whether the node should have border.";
example = true;
};
};
};
in {
xsession.windowManager.bspwm = {
enable = mkEnableOption "bspwm window manager";
package = mkOption {
type = types.package;
default = pkgs.bspwm;
defaultText = literalExpression "pkgs.bspwm";
description = "The bspwm package to use.";
example = literalExpression "pkgs.bspwm-unstable";
};
settings = mkOption {
type = with types;
let primitive = either bool (either int (either float str));
in attrsOf (either primitive (listOf primitive));
default = { };
description = "General settings given to <literal>bspc config</literal>.";
example = {
"border_width" = 2;
"split_ratio" = 0.52;
"gapless_monocle" = true;
};
};
extraConfig = mkOption {
type = types.lines;
default = "";
description =
"Additional shell commands to be run at the end of the config file.";
example = ''
bspc subscribe all > ~/bspc-report.log &
'';
};
monitors = mkOption {
type = types.attrsOf (types.listOf types.str);
default = { };
description =
"Specifies the names of desktops to create on each monitor.";
example = { "HDMI-0" = [ "web" "terminal" "III" "IV" ]; };
};
alwaysResetDesktops = mkOption {
type = types.bool;
default = true;
description = ''
If set to <literal>true</literal>, desktops configured in <option>monitors</option> will be reset
every time the config is run.
If set to <literal>false</literal>, desktops will only be configured the first time the config is run.
This is useful if you want to dynamically add desktops and you don't want them to be destroyed if you
re-run <literal>bspwmrc</literal>.
'';
};
rules = mkOption {
type = types.attrsOf rule;
default = { };
description =
"Rule configuration. The keys of the attribute set are the targets of the rules.";
example = literalExpression ''
{
"Gimp" = {
desktop = "^8";
state = "floating";
follow = true;
};
"Kupfer.py" = {
focus = true;
};
"Screenkey" = {
manage = false;
};
}
'';
};
startupPrograms = mkOption {
type = types.listOf types.str;
default = [ ];
description = "Programs to be executed during startup.";
example = [ "numlockx on" "tilda" ];
};
};
}