1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-12-02 23:21:02 +01:00
home-manager/modules/services/window-managers/i3-sway/lib/functions.nix
Austin Horstman 82ee14ff60
treewide: remove with lib (#6871)
Remove from services.
2025-04-21 11:00:59 -05:00

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);
}