{ pkgs, config, lib, ... }: with lib; let cfg = config.eboskma.programs.polybar; colors = { background = "#cc000000"; foreground = "#ffffffff"; urgent = "#c9545d"; }; polybar-playerctl = let pythonWithPackages = pkgs.python3.withPackages (pythonPackages: [ pythonPackages.pygobject3 ]); in pkgs.stdenv.mkDerivation { name = "polybar-playerctl"; buildInputs = [ pythonWithPackages pkgs.playerctl ]; propagatedBuildInputs = [ pythonWithPackages pkgs.python3Packages.pygobject3 pkgs.playerctl ]; nativeBuildInputs = [ pkgs.gobject-introspection pkgs.wrapGAppsHook ]; strictDeps = false; dontUnpack = true; installPhase = '' mkdir -p $out/bin cp ${./scripts/polybar-playerctl} $out/bin/polybar-playerctl chmod +x $out/bin/polybar-playerctl ''; }; headset-battery = pkgs.writeShellScript "headset-battery" '' battery_level=$(${pkgs.headsetcontrol}/bin/headsetcontrol -c -b 2> /dev/null) if [[ $? -ne 0 ]]; then printf "" exit fi battery_icons=( ) battery_charging="" if [[ "''${battery_level}" -eq -1 ]]; then printf "%s " "''${battery_charging}" else idx=$(((battery_level / 10))) if [[ "''${idx}" -eq 10 ]]; then idx=9 fi battery_icon="''${battery_icons[''${idx}]}" printf "%s %i%%" "''${battery_icon}" "''${battery_level}" fi ''; in { options.eboskma.programs.polybar = { enable = mkEnableOption "activate polybar"; }; config = mkIf cfg.enable { # systemd.user.services.polybar = { # Install = { WantedBy = [ "graphical-session.target" ]; }; # }; services.polybar = { enable = true; package = pkgs.polybarFull.override { i3Support = true; pulseSupport = true; mpdSupport = true; }; script = '' ${pkgs.polybar}/bin/polybar-msg cmd quit while ${pkgs.procps}/bin/pgrep -u ''${UID} -x polybar > /dev/null; do sleep 0.1; done outputs=$(${pkgs.polybar}/bin/polybar -m | ${pkgs.gnugrep}/bin/grep -v primary | ${pkgs.coreutils}/bin/cut -d ':' -f 1) primary=$(${pkgs.polybar}/bin/polybar -m | ${pkgs.gnugrep}/bin/grep primary | ${pkgs.coreutils}/bin/cut -d ':' -f 1) MONITOR=''${primary} polybar -q main & disown sleep 0.5 # Make sure the primary bar is started so the tray appears here for m in ''${outputs}; do MONITOR=''${m} polybar -q main & disown done ''; settings = { "global/wm" = { margin.bottom = 0; margin.top = 0; }; "bar/main" = { monitor = "\${env:MONITOR:DP-0}"; fixed.center = true; width = "100%"; height = 48; # offset.x = "1%"; # offset.y = "2%"; offset.x = 0; offset.y = 0; background = "${colors.background}"; foreground = "${colors.foreground}"; line.size = 2; font = [ "Iosevka Nerd Font:style=Bold:size=16;2" "Iosevka Nerd Font:size=18;3" "Iosevka Nerd Font:size=20;4" ]; modules = { left = "workspaces playerctl"; center = "date"; right = "headset-battery memory cpu pulseaudio network"; }; dim.value = 0.8; tray = { position = "right"; detached = false; maxsize = 24; background = "${colors.background}"; offset.x = 0; offset.y = 0; padding = 0; scale = 1.0; }; enable.ipc = true; cursor = { click = "pointer"; }; }; settings = { screenchange.reload = false; throttle.output.text = 5; throttle.output.for = 10; compositing = { background = "source"; foreground = "over"; overline = "over"; underline = "over"; border = "over"; }; pseudo.transparency = false; }; "module/workspaces" = { type = "internal/i3"; pin.workspaces = true; strip.wsnumbers = true; enable.click = true; enable.scroll = true; format = "<label-state> <label-mode>"; label = { mode = { text = " %mode%"; # Icon: arrow_expand_all padding = 1; }; focused = { text = " %index%"; # Icon: fa-circle padding = 1; background = "#333333"; underline = "#ffffff"; }; unfocused = { text = " %index%"; # Icon: fa-circle_o padding = 1; }; visible = { text = " %index%"; # Icon: fa-dot_circle_o padding = 1; }; urgent = { text = " %index%"; # Icon: fa-exclamation_circle background = "${colors.urgent}"; padding = 1; }; }; }; "module/playerctl" = { type = "custom/script"; exec = "${polybar-playerctl}/bin/polybar-playerctl"; interval = 1; click = { left = "${polybar-playerctl}/bin/polybar-playerctl play-pause"; middle = "${polybar-playerctl}/bin/polybar-playerctl next"; right = "${polybar-playerctl}/bin/polybar-playerctl prevous"; }; format.padding = 2; scroll.up = "${polybar-playerctl}/bin/polybar-playerctl next-player"; }; "module/date" = { type = "internal/date"; interval = 1.0; time = { text = " %H:%M:%S"; alt = " %a, %d %b %Y"; }; format = { text = "<label>"; padding = 2; }; label.text = "%time%"; }; "module/headset-battery" = { type = "custom/script"; exec = "${headset-battery}"; interval = 1; format = { prefix = " "; # Icon: headset padding = 2; }; label.text = "%output%"; click = { left = "${pkgs.headsetcontrol}/bin/headsetcontrol -s 128"; right = "${pkgs.headsetcontrol}/bin/headsetcontrol -s 0"; }; }; "module/memory" = { type = "internal/memory"; interval = 1; format = { text = "<label>"; prefix = " "; # Icon: memory padding = 2; }; label.text = "%mb_used% (%percentage_used%%)"; }; "module/cpu" = { type = "internal/cpu"; interval = 1; format = { text = "<label>"; prefix = " "; # Icon: cpu_64_bit padding = 2; }; label = "%percentage:3%%"; }; "module/pulseaudio" = { type = "internal/pulseaudio"; interval = 5; use.ui.max = false; format = { volume = { text = "<ramp-volume> <label-volume>"; padding = 2; }; muted = { text = "<label-muted>"; prefix = ""; # Icon: volume_off background = "${colors.urgent}"; padding = 2; }; }; label = { volume.text = "%percentage%%"; muted.text = " Muted"; }; ramp.volume = [ "" "" "" ]; # Icons: volume_low volume_medium volume_high click.right = "${pkgs.pavucontrol}/bin/pavucontrol"; }; "module/network" = { type = "internal/network"; interval = 1; interface = "enp4s0"; click-left = "${pkgs.networkmanagerapplet}/bin/nm-connection-editor"; accumulate.stats = true; unknown.as.up = true; format = { connected = { text = "<label-connected>"; padding = 2; }; disconnected = { text = "<label-disconnected>"; padding = 2; }; packetloss.text = "<animation-packetloss> <label-connected>"; }; label = { connected.text = " %local_ip% %upspeed:9% %downspeed:9%"; # Icon: ethernet disconnected.text = " %{A1:networkmanager_dmenu &:} Offline%{A}"; # Icon: network_off_outline }; animation = { packetloss.text = [ { text = "⚠"; foreground = "${colors.urgent}"; } { text = "⚠"; foreground = "${colors.foreground}"; } ]; packetloss.framerate = 500; }; }; }; }; }; }