mirror of
https://github.com/nix-community/home-manager.git
synced 2025-12-02 23:21:02 +01:00
230 lines
7.1 KiB
Nix
230 lines
7.1 KiB
Nix
{
|
|
cfg,
|
|
config,
|
|
lib,
|
|
moduleName,
|
|
}:
|
|
let
|
|
inherit (lib) concatStringsSep mapAttrsToList optionalString;
|
|
in
|
|
rec {
|
|
criteriaStr =
|
|
criteria:
|
|
let
|
|
toCriteria = k: v: if builtins.isBool v then (if v then "${k}" else "") else ''${k}="${v}"'';
|
|
in
|
|
"[${concatStringsSep " " (mapAttrsToList toCriteria criteria)}]";
|
|
|
|
keybindingDefaultWorkspace = lib.filterAttrs (
|
|
n: v: cfg.config.defaultWorkspace != null && v == cfg.config.defaultWorkspace
|
|
) cfg.config.keybindings;
|
|
|
|
keybindingsRest = lib.filterAttrs (
|
|
n: v: cfg.config.defaultWorkspace == null || v != cfg.config.defaultWorkspace
|
|
) cfg.config.keybindings;
|
|
|
|
keybindingsStr =
|
|
{
|
|
keybindings,
|
|
bindsymArgs ? "",
|
|
indent ? "",
|
|
}:
|
|
concatStringsSep "\n" (
|
|
mapAttrsToList (
|
|
keycomb: action:
|
|
optionalString (action != null)
|
|
"${indent}bindsym ${lib.optionalString (bindsymArgs != "") "${bindsymArgs} "}${keycomb} ${action}"
|
|
) keybindings
|
|
);
|
|
|
|
keycodebindingsStr =
|
|
keycodebindings:
|
|
concatStringsSep "\n" (
|
|
mapAttrsToList (
|
|
keycomb: action: optionalString (action != null) "bindcode ${keycomb} ${action}"
|
|
) keycodebindings
|
|
);
|
|
|
|
colorSetStr =
|
|
c:
|
|
concatStringsSep " " [
|
|
c.border
|
|
c.background
|
|
c.text
|
|
c.indicator
|
|
c.childBorder
|
|
];
|
|
barColorSetStr =
|
|
c:
|
|
concatStringsSep " " [
|
|
c.border
|
|
c.background
|
|
c.text
|
|
];
|
|
|
|
modeStr = bindkeysToCode: name: keybindings: ''
|
|
mode "${name}" {
|
|
${keybindingsStr {
|
|
inherit keybindings;
|
|
bindsymArgs = lib.optionalString bindkeysToCode "--to-code";
|
|
indent = " ";
|
|
}}
|
|
}
|
|
'';
|
|
|
|
assignStr =
|
|
workspace: criteria:
|
|
concatStringsSep "\n" (map (c: "assign ${criteriaStr c} ${workspace}") criteria);
|
|
|
|
fontConfigStr =
|
|
let
|
|
toFontStr =
|
|
{
|
|
names,
|
|
style ? "",
|
|
size ? "",
|
|
}:
|
|
optionalString (names != [ ]) concatStringsSep " " (
|
|
lib.remove "" [
|
|
"font"
|
|
"pango:${concatStringsSep ", " names}"
|
|
style
|
|
size
|
|
]
|
|
);
|
|
in
|
|
fontCfg:
|
|
if lib.isList fontCfg then
|
|
toFontStr { names = fontCfg; }
|
|
else
|
|
toFontStr {
|
|
inherit (fontCfg) names style;
|
|
size = toString fontCfg.size;
|
|
};
|
|
|
|
barStr =
|
|
{
|
|
id,
|
|
fonts,
|
|
mode,
|
|
hiddenState,
|
|
position,
|
|
workspaceButtons,
|
|
workspaceNumbers,
|
|
command,
|
|
statusCommand,
|
|
colors,
|
|
trayOutput,
|
|
trayPadding,
|
|
extraConfig,
|
|
...
|
|
}:
|
|
let
|
|
colorsNotNull = lib.filterAttrs (n: v: v != null) colors != { };
|
|
in
|
|
lib.concatMapStrings (x: x + "\n") (
|
|
indent (lib.lists.subtractLists [ "" null ] (
|
|
lib.flatten [
|
|
"bar {"
|
|
(optionalString (id != null) "id ${id}")
|
|
(fontConfigStr fonts)
|
|
(optionalString (mode != null) "mode ${mode}")
|
|
(optionalString (hiddenState != null) "hidden_state ${hiddenState}")
|
|
(optionalString (position != null) "position ${position}")
|
|
(optionalString (statusCommand != null) "status_command ${statusCommand}")
|
|
"${moduleName}bar_command ${command}"
|
|
(optionalString (
|
|
workspaceButtons != null
|
|
) "workspace_buttons ${lib.hm.booleans.yesNo workspaceButtons}")
|
|
(optionalString (workspaceNumbers != null)
|
|
"strip_workspace_numbers ${lib.hm.booleans.yesNo (!workspaceNumbers)}"
|
|
)
|
|
(optionalString (trayOutput != null) "tray_output ${trayOutput}")
|
|
(optionalString (trayPadding != null) "tray_padding ${toString trayPadding}")
|
|
(lib.optionals colorsNotNull (
|
|
indent (lib.lists.subtractLists
|
|
[ "" null ]
|
|
[
|
|
"colors {"
|
|
(optionalString (colors.background != null) "background ${colors.background}")
|
|
(optionalString (colors.statusline != null) "statusline ${colors.statusline}")
|
|
(optionalString (colors.separator != null) "separator ${colors.separator}")
|
|
(optionalString (colors.focusedBackground != null) "focused_background ${colors.focusedBackground}")
|
|
(optionalString (colors.focusedStatusline != null) "focused_statusline ${colors.focusedStatusline}")
|
|
(optionalString (colors.focusedSeparator != null) "focused_separator ${colors.focusedSeparator}")
|
|
(optionalString (
|
|
colors.focusedWorkspace != null
|
|
) "focused_workspace ${barColorSetStr colors.focusedWorkspace}")
|
|
(optionalString (
|
|
colors.activeWorkspace != null
|
|
) "active_workspace ${barColorSetStr colors.activeWorkspace}")
|
|
(optionalString (
|
|
colors.inactiveWorkspace != null
|
|
) "inactive_workspace ${barColorSetStr colors.inactiveWorkspace}")
|
|
(optionalString (
|
|
colors.urgentWorkspace != null
|
|
) "urgent_workspace ${barColorSetStr colors.urgentWorkspace}")
|
|
(optionalString (colors.bindingMode != null) "binding_mode ${barColorSetStr colors.bindingMode}")
|
|
"}"
|
|
]
|
|
) { }
|
|
))
|
|
extraConfig
|
|
"}"
|
|
]
|
|
)) { }
|
|
);
|
|
|
|
gapsStr =
|
|
with cfg.config.gaps;
|
|
concatStringsSep "\n" (
|
|
lib.lists.subtractLists
|
|
[ "" null ]
|
|
[
|
|
(optionalString (inner != null) "gaps inner ${toString inner}")
|
|
(optionalString (outer != null) "gaps outer ${toString outer}")
|
|
(optionalString (horizontal != null) "gaps horizontal ${toString horizontal}")
|
|
(optionalString (vertical != null) "gaps vertical ${toString vertical}")
|
|
(optionalString (top != null) "gaps top ${toString top}")
|
|
(optionalString (bottom != null) "gaps bottom ${toString bottom}")
|
|
(optionalString (left != null) "gaps left ${toString left}")
|
|
(optionalString (right != null) "gaps right ${toString right}")
|
|
(optionalString smartGaps "smart_gaps on")
|
|
(optionalString (smartBorders != "off") "smart_borders ${smartBorders}")
|
|
]
|
|
);
|
|
|
|
windowBorderString =
|
|
window: floating:
|
|
let
|
|
titlebarString =
|
|
{ titlebar, border, ... }: "${if titlebar then "normal" else "pixel"} ${toString border}";
|
|
in
|
|
concatStringsSep "\n" [
|
|
"default_border ${titlebarString window}"
|
|
"default_floating_border ${titlebarString floating}"
|
|
];
|
|
|
|
floatingCriteriaStr = criteria: "for_window ${criteriaStr criteria} floating enable";
|
|
windowCommandsStr = { command, criteria, ... }: "for_window ${criteriaStr criteria} ${command}";
|
|
workspaceOutputStr =
|
|
item:
|
|
let
|
|
outputs = lib.concatMapStringsSep " " lib.strings.escapeNixString item.output;
|
|
in
|
|
''workspace "${item.workspace}" output ${outputs}'';
|
|
|
|
indent =
|
|
list:
|
|
{
|
|
includesWrapper ? true,
|
|
level ? 1,
|
|
}:
|
|
let
|
|
prefix = concatStringsSep "" (lib.genList (x: " ") (level * 2));
|
|
|
|
in
|
|
(lib.imap1 (
|
|
i: v: "${if includesWrapper && (i == 1 || i == (lib.length list)) then v else "${prefix}${v}"}"
|
|
) list);
|
|
}
|