From e2a85ac43f06859a50d067a029f0a303c4ca5264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Na=C3=AFm=20Favier?= Date: Fri, 18 Mar 2022 03:56:56 +0100 Subject: [PATCH] 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`. --- modules/services/window-managers/bspwm/default.nix | 14 +++++++++++++- modules/services/window-managers/bspwm/options.nix | 13 +++++++++++++ .../modules/services/window-managers/bspwm/bspwmrc | 4 +++- .../window-managers/bspwm/configuration.nix | 1 + 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/modules/services/window-managers/bspwm/default.nix b/modules/services/window-managers/bspwm/default.nix index b14ffccd9..f20c01221 100644 --- a/modules/services/window-managers/bspwm/default.nix +++ b/modules/services/window-managers/bspwm/default.nix @@ -10,7 +10,19 @@ let builtins.replaceStrings upperChars (map (c: "_${c}") lowerChars); formatMonitor = monitor: desktops: - "bspc monitor ${escapeShellArg monitor} -d ${escapeShellArgs desktops}"; + let + resetDesktops = + "bspc monitor ${escapeShellArg monitor} -d ${escapeShellArgs desktops}"; + defaultDesktopName = + "Desktop"; # https://github.com/baskerville/bspwm/blob/master/src/desktop.h + in if cfg.alwaysResetDesktops then + resetDesktops + else '' + if [[ $(bspc query --desktops --names --monitor ${ + escapeShellArg monitor + }) == ${defaultDesktopName} ]]; then + ${resetDesktops} + fi''; formatValue = v: if isList v then diff --git a/modules/services/window-managers/bspwm/options.nix b/modules/services/window-managers/bspwm/options.nix index 60a06c5a0..57a1d874a 100644 --- a/modules/services/window-managers/bspwm/options.nix +++ b/modules/services/window-managers/bspwm/options.nix @@ -185,6 +185,19 @@ in { example = { "HDMI-0" = [ "web" "terminal" "III" "IV" ]; }; }; + alwaysResetDesktops = mkOption { + type = types.bool; + default = true; + description = '' + If set to true, desktops configured in 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. + ''; + }; + rules = mkOption { type = types.attrsOf rule; default = { }; diff --git a/tests/modules/services/window-managers/bspwm/bspwmrc b/tests/modules/services/window-managers/bspwm/bspwmrc index 7ebb64aca..ba0da830a 100755 --- a/tests/modules/services/window-managers/bspwm/bspwmrc +++ b/tests/modules/services/window-managers/bspwm/bspwmrc @@ -1,4 +1,6 @@ -bspc monitor 'focused' -d 'desktop 1' 'd'\''esk top' +if [[ $(bspc query --desktops --names --monitor 'focused') == Desktop ]]; then + bspc monitor 'focused' -d 'desktop 1' 'd'\''esk top' +fi bspc config 'border_width' '2' bspc config 'external_rules_command' '/path/to/external rules command' diff --git a/tests/modules/services/window-managers/bspwm/configuration.nix b/tests/modules/services/window-managers/bspwm/configuration.nix index 8018a3ac1..e4aec0f6c 100644 --- a/tests/modules/services/window-managers/bspwm/configuration.nix +++ b/tests/modules/services/window-managers/bspwm/configuration.nix @@ -8,6 +8,7 @@ with lib; enable = true; monitors.focused = [ "desktop 1" "d'esk top" ]; # pathological desktop names + alwaysResetDesktops = false; settings = { border_width = 2; split_ratio = 0.52;