mirror of
https://github.com/nix-community/home-manager
synced 2025-01-12 03:59:49 +01:00
b270fcef2f
PR #362, #981 Co-authored-by: Vincent Breitmoser <look@my.amazin.horse>
71 lines
2.2 KiB
Nix
71 lines
2.2 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
|
|
cfg = config.xsession.windowManager.bspwm;
|
|
bspwm = cfg.package;
|
|
|
|
camelToSnake = s:
|
|
builtins.replaceStrings lib.upperChars (map (c: "_${c}") lib.lowerChars) s;
|
|
|
|
formatConfig = n: v:
|
|
let
|
|
formatList = x:
|
|
if isList x
|
|
then throw "can not convert 2-dimensional lists to bspwm format"
|
|
else formatValue x;
|
|
|
|
formatValue = v:
|
|
if isBool v then (if v then "true" else "false")
|
|
else if isList v then concatMapStringsSep ", " formatList v
|
|
else if isString v then "${lib.strings.escapeShellArg v}"
|
|
else toString v;
|
|
in
|
|
"bspc config ${n} ${formatValue v}";
|
|
|
|
formatMonitors = n: v: "bspc monitor ${n} -d ${concatStringsSep " " v}";
|
|
|
|
formatRules = target: directiveOptions:
|
|
let
|
|
formatDirective = n: v:
|
|
if isBool v then (if v then "${camelToSnake n}=on" else "${camelToSnake n}=off")
|
|
else if (n == "desktop" || n == "node") then "${camelToSnake n}='${v}'"
|
|
else "${camelToSnake n}=${lib.strings.escapeShellArg v}";
|
|
|
|
directives = filterAttrs (n: v: v != null && !(lib.strings.hasPrefix "_" n)) directiveOptions;
|
|
directivesStr = builtins.concatStringsSep " " (mapAttrsToList formatDirective directives);
|
|
in
|
|
"bspc rule -a ${target} ${directivesStr}";
|
|
|
|
formatStartupPrograms = map (s: "${s} &");
|
|
|
|
in
|
|
|
|
{
|
|
options = import ./options.nix { inherit pkgs; inherit lib; };
|
|
|
|
config = mkIf cfg.enable {
|
|
home.packages = [ bspwm ];
|
|
xsession.windowManager.command =
|
|
let
|
|
configFile = pkgs.writeShellScript "bspwmrc" (
|
|
concatStringsSep "\n" (
|
|
(mapAttrsToList formatMonitors cfg.monitors)
|
|
++ (mapAttrsToList formatConfig cfg.settings)
|
|
++ (mapAttrsToList formatRules cfg.rules)
|
|
++ [ ''
|
|
# java gui fixes
|
|
export _JAVA_AWT_WM_NONREPARENTING=1
|
|
bspc rule -a sun-awt-X11-XDialogPeer state=floating
|
|
'' ]
|
|
++ [ cfg.extraConfig ]
|
|
++ (formatStartupPrograms cfg.startupPrograms)
|
|
)
|
|
);
|
|
configCmdOpt = optionalString (cfg.settings != null) "-c ${configFile}";
|
|
in
|
|
"${cfg.package}/bin/bspwm ${configCmdOpt}";
|
|
};
|
|
}
|