{ nixosConfig , config , pkgs , lib , ... }: let inherit (pkgs.rice) colorPalette opacity; inherit (pkgs.lib) nix-rice; alpha = 255 * opacity; grep = "${pkgs.gnugrep}/bin/grep"; cut = "${pkgs.coreutils}/bin/cut"; pavucontrol = "${pkgs.pavucontrol}/bin/pavucontrol"; pgrep = "${pkgs.procps}/bin/pgrep"; pkill = "${pkgs.procps}/bin/pkill"; playerCtl = "${pkgs.playerctl}/bin/playerctl"; dunstctl = "${pkgs.dunst}/bin/dunstctl"; zscroll = "${pkgs.zscroll}/bin/zscroll"; notificationStatus = pkgs.writeShellScript "notificationStatus" '' PATH=$PATH:"${lib.makeBinPath [ pkgs.dbus ]}" if [[ `${dunstctl} is-paused` == "true" ]]; then echo 󰂛; else echo 󰂚; fi ''; notificationToggle = pkgs.writeShellScript "notificationToggle" '' PATH=$PATH:"${lib.makeBinPath [ pkgs.dbus ]}" ${dunstctl} set-paused toggle ''; keyboardStatus = pkgs.writeShellScript "keyboardStatus" '' PATH=$PATH:"${lib.makeBinPath [ pkgs.coreutils ]}" STATE=~/.local/share/keyboard-switch.state touch $STATE if [[ `cat $STATE` == "disabled" ]]; then echo 󰌐; else echo 󰌌; fi ''; keyboardToggle = pkgs.writeShellScript "keyboardToggle" '' PATH=$PATH:"${lib.makeBinPath [ pkgs.keyboard-switch ]}" keyboard-switch ''; notificationHistory = pkgs.writeShellScript "notificationToggle" '' PATH=$PATH:"${lib.makeBinPath [ pkgs.dbus ]}" ${dunstctl} set-paused false for i in {1..10}; do ${dunstctl} history-pop; done ''; playerStatusBasic = pkgs.writeShellScript "playerStatusBasic" '' ${playerCtl} status || true ''; playerStatusSrc = pkgs.writeShellScript "playerStatusSrc" '' ${playerCtl} -f '{{title}} - {{artist}}' metadata || true ''; playerStatus = pkgs.writeShellScript "playerStatus" '' ${zscroll} -l 25 -M ${playerStatusBasic} \ -m "Playing" "-b '▶ ' -s 1" \ -m "Paused" "-b '⏸ ' -s 0" \ -u true ${playerStatusSrc} & wait ''; powermenu = pkgs.writeShellScript "powermenu" '' PATH=$PATH:"${ lib.makeBinPath [ pkgs.rofi pkgs.rofi-power-menu pkgs.zsh ] }" zsh -c 'rofi -show menu -modi "menu:rofi-power-menu --choices=shutdown/reboot/hibernate/logout"' ''; colors = nix-rice.palette.toARGBHex rec { normal = { foreground = nix-rice.color.darken 10 colorPalette.foreground; background = nix-rice.color.setAlphaRgba alpha colorPalette.background; underline = colorPalette.normal.blue; }; active = { inherit (colorPalette) foreground; background = nix-rice.color.setAlphaRgba alpha colorPalette.background; underline = colorPalette.normal.yellow; }; selected = { inherit (colorPalette) foreground; background = nix-rice.color.setAlphaRgba alpha colorPalette.background; underline = colorPalette.bright.red; }; inherit (colorPalette.normal) green red yellow; inherit (nix-rice.color) transparent; orange = colorPalette.bright.red; alert = orange; }; commonBar = { locale = config.home.language.base; monitor = "\${env:MONITOR}"; width = "100%"; height = 20; radius = 6.0; fixed-center = false; inherit (colors.normal) background foreground; line-size = 2; line-color = colors.normal.underline; padding = 0; module.margin = 0; separator = " "; border = { color = colors.transparent; left.size = 2; righ.sizet = 2; top.size = 2; bottom.size = 0; }; font = [ "${pkgs.rice.font.monospace.name}:size=${toString pkgs.rice.font.monospace.size};2" # "Font Awesome 6 Free:size=14;0" # "Noto Color Emoji:size=2;2" "Noto Sans Symbols2:size=${toString pkgs.rice.font.monospace.size};2" "Material Design Icons:size=${toString pkgs.rice.font.monospace.size};2" # "EmojiOne Color:size=${toString pkgs.rice.font.monospace.size};0" "Noto Sans CJK JP:size=${toString pkgs.rice.font.monospace.size};0" "Noto Sans CJK KR:size=${toString pkgs.rice.font.monospace.size};0" "Noto Sans CJK CN:size=${toString pkgs.rice.font.monospace.size};0" "Noto Sans CJK HK:size=${toString pkgs.rice.font.monospace.size};0" ]; enable-ipc = true; wm-restack = "bspwm"; }; ramp = [ "▂" "▃" "▄" "▅" "▆" "▇" ]; in { home.packages = builtins.attrValues { inherit (pkgs) noto-fonts material-design-icons noto-fonts-cjk-sans; # emojione # noto-fonts-emoji # font-awesome inherit (pkgs.rice.font.monospace) package; }; services.polybar = { enable = true; package = pkgs.polybarFull; script = '' monitor=`polybar -m | ${grep} primary | ${cut} -d":" -f1` MONITOR=$monitor polybar primary & monitors=(`polybar -m | ${grep} -v primary | ${cut} -d":" -f1`) for monitor in "''${monitors[@]}"; do MONITOR=$monitor polybar secondary & done ''; settings = { "settings" = { screenchange-reload = false; }; "bar/primary" = lib.recursiveUpdate commonBar { modules-left = "bspwm"; # modules-center = modules-right = "player pulseaudio temperature cpu memory battery keyboard-switch notifications powermenu date"; tray = { position = "right"; padding = 1; }; }; "bar/secondary" = lib.recursiveUpdate commonBar { modules-left = "bspwm"; # modules-center = modules-right = "player pulseaudio temperature cpu memory battery keyboard-switch notifications powermenu date"; }; "module/battery" = { type = "internal/battery"; adapter = "AC"; battery = "BAT0"; full.at = 98; animation = { charging = { text = [ "" "" "" "" "" ]; framerate = "750"; }; discharging = { text = [ "" "" "" "" "" ]; framerate = "750"; }; }; format = { charging = lib.recursiveUpdate colors.selected { text = " "; }; discharging = lib.recursiveUpdate colors.active { text = " "; }; full = lib.recursiveUpdate colors.normal { text = " "; }; }; label.text = "%percentage%%"; # = { # chargin = "%percentage%%"; # dischargin = "%percentage%%"; # full = "%percentage%%"; # }; }; "module/bspwm" = { type = "internal/bspwm"; format = ""; label = let common = { padding = 1; # separator = " "; text = "%name%"; }; in { focused = lib.recursiveUpdate common colors.selected; occupied = lib.recursiveUpdate common colors.active; urgent = lib.recursiveUpdate (lib.recursiveUpdate common colors.active) { background = colors.alert; }; empty = lib.recursiveUpdate common colors.normal; }; }; "module/cpu" = { type = "internal/cpu"; format = lib.recursiveUpdate colors.normal { text = "