{ config, lib, pkgs, ... }: let cfg = config.my.bspwm; in { options.my.bspwm.monitors = lib.mkOption { default = [ ]; description = "Monitors left to right. Empty means single-monitor defaults."; type = lib.types.listOf (lib.types.submodule { options = { name = lib.mkOption { type = lib.types.str; }; xrandr = lib.mkOption { type = lib.types.str; default = "--auto"; description = "Arguments for xrandr --output ."; }; desktops = lib.mkOption { type = lib.types.listOf lib.types.str; }; }; }); }; config = { xdg.configFile."bspwm/bspwmrc" = { executable = true; text = '' #!/bin/sh ${lib.optionalString (cfg.monitors != [ ]) '' ${pkgs.xrandr}/bin/xrandr ${lib.concatMapStringsSep " " (m: "--output ${m.name} ${m.xrandr}") cfg.monitors} ''} ${if cfg.monitors == [ ] then "bspc monitor -d 1 2 3 4 5 6 7 8 9" else lib.concatMapStringsSep "\n" (m: "bspc monitor ${m.name} -d ${lib.concatStringsSep " " m.desktops}") cfg.monitors} # Gaps and borders bspc config window_gap 10 bspc config border_width 2 bspc config focused_border_color "#7aa2f7" bspc config normal_border_color "#292e42" # Layout behaviour bspc config split_ratio 0.50 bspc config borderless_monocle true bspc config gapless_monocle true # Launch polybar ~/.config/polybar/launch.sh # Wallpapers [ -x ~/.config/wallpaper/set.sh ] && ~/.config/wallpaper/set.sh # Picom ${pkgs.procps}/bin/pgrep -x picom >/dev/null || ${pkgs.picom}/bin/picom -b --config $HOME/.config/picom/picom.conf ''; }; home.activation.reloadBspwm = lib.hm.dag.entryAfter [ "linkGeneration" ] '' if ${pkgs.procps}/bin/pgrep -x bspwm >/dev/null; then PATH=${pkgs.bspwm}/bin:$PATH DISPLAY=:0 $HOME/.config/bspwm/bspwmrc \ || echo "bspwmrc reload failed" >&2 fi ''; }; }