1
0
mirror of https://github.com/nix-community/home-manager synced 2024-06-28 17:38:33 +02:00
home-manager/modules/services/window-managers/herbstluftwm.nix
Emily 9f9e277b60 treewide: remove now-redundant lib.mdDoc calls
These (and the `*MD` functions apart from `literalMD`) are now no-ops
in nixpkgs and serve no purpose other than to add additional noise and
potentially mislead people into thinking unmarked DocBook documentation
will still be accepted.

Note that if backporting changes including documentation to 23.05,
the `mdDoc` calls will need to be re-added.

To reproduce this commit, run:

    $ NIX_PATH=nixpkgs=flake:nixpkgs/e7e69199f0372364a6106a1e735f68604f4c5a25 \
      nix shell nixpkgs#coreutils \
      -c find . -name '*.nix' \
      -exec nix run -- github:emilazy/nix-doc-munge/98dadf1f77351c2ba5dcb709a2a171d655f15099 \
      --strip {} +
    $ ./format
2023-07-17 18:49:09 +01:00

176 lines
4.7 KiB
Nix

{ config, lib, pkgs, ... }:
let
cfg = config.xsession.windowManager.herbstluftwm;
renderValue = val:
if lib.isBool val then
if val then "true" else "false"
else
lib.escapeShellArg val;
renderSettings = settings:
lib.concatStringsSep "\n" (lib.mapAttrsToList
(name: value: "herbstclient set ${name} ${renderValue value}") settings);
renderKeybinds = keybinds:
lib.concatStringsSep "\n"
(lib.mapAttrsToList (key: cmd: "herbstclient keybind ${key} ${cmd}")
keybinds);
renderMousebinds = mousebinds:
lib.concatStringsSep "\n"
(lib.mapAttrsToList (btn: cmd: "herbstclient mousebind ${btn} ${cmd}")
mousebinds);
renderRules = rules:
lib.concatStringsSep "\n" (map (rule: "herbstclient rule ${rule}") rules);
settingType = lib.types.oneOf [ lib.types.bool lib.types.int lib.types.str ];
escapedTags = map lib.escapeShellArg cfg.tags;
in {
meta.maintainers = [ lib.hm.maintainers.olmokramer ];
options.xsession.windowManager.herbstluftwm = {
enable = lib.mkEnableOption "herbstluftwm window manager";
package = lib.mkOption {
type = lib.types.package;
default = pkgs.herbstluftwm;
defaultText = lib.literalExpression "pkgs.herbstluftwm";
description = ''
Package providing the {command}`herbstluftwm` and
{command}`herbstclient` commands.
'';
};
settings = lib.mkOption {
type = lib.types.attrsOf settingType;
default = { };
example = lib.literalExpression ''
{
gapless_grid = false;
window_border_width = 1;
window_border_active_color = "#FF0000";
}
'';
description = "Herbstluftwm settings.";
};
keybinds = lib.mkOption {
type = lib.types.attrsOf lib.types.str;
default = { };
example = lib.literalExpression ''
{
Mod4-o = "split right";
Mod4-u = "split bottom";
}
'';
description = "Herbstluftwm keybinds.";
};
mousebinds = lib.mkOption {
type = lib.types.attrsOf lib.types.str;
default = { };
example = lib.literalExpression ''
{
Mod4-B1 = "move";
Mod4-B3 = "resize";
}
'';
description = "Herbstluftwm mousebinds.";
};
rules = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
example = lib.literalExpression ''
[
"windowtype~'_NET_WM_WINDOW_TYPE_(DIALOG|UTILITY|SPLASH)' focus=on pseudotile=on"
"windowtype~'_NET_WM_WINDOW_TYPE_(NOTIFICATION|DOCK|DESKTOP)' manage=off"
]
'';
description = "Herbstluftwm rules.";
};
tags = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
example = lib.literalExpression ''
[ "work" "browser" "music" "gaming" ]
'';
description = "Tags to create on startup.";
};
extraConfig = lib.mkOption {
type = lib.types.lines;
default = "";
example = ''
herbstclient set_layout max
herbstclient detect_monitors
'';
description = ''
Extra configuration lines to add verbatim to
{file}`$XDG_CONFIG_HOME/herbstluftwm/autostart`.
'';
};
};
config = lib.mkIf cfg.enable {
assertions = [
(lib.hm.assertions.assertPlatform "xsession.windowManager.herbstluftwm"
pkgs lib.platforms.linux)
];
home.packages = [ cfg.package ];
xsession.windowManager.command = "${cfg.package}/bin/herbstluftwm --locked";
xdg.configFile."herbstluftwm/autostart".source =
pkgs.writeShellScript "herbstluftwm-autostart" ''
shopt -s expand_aliases
# shellcheck disable=SC2142
alias herbstclient='set -- "$@" ";"'
set --
herbstclient emit_hook reload
# Reset everything.
herbstclient attr theme.tiling.reset 1
herbstclient attr theme.floating.reset 1
herbstclient keyunbind --all
herbstclient mouseunbind --all
herbstclient unrule --all
${renderSettings cfg.settings}
${lib.optionalString (cfg.tags != [ ]) ''
for tag in ${lib.concatStringsSep " " escapedTags}; do
herbstclient add "$tag"
done
if ${cfg.package}/bin/herbstclient object_tree tags.by-name.default &>/dev/null; then
herbstclient use ${lib.head escapedTags}
herbstclient merge_tag default ${lib.head escapedTags}
fi
''}
${renderKeybinds cfg.keybinds}
${renderMousebinds cfg.mousebinds}
${renderRules cfg.rules}
${cfg.extraConfig}
herbstclient unlock
${cfg.package}/bin/herbstclient chain ";" "$@"
'';
};
}