{ config, lib, pkgs, ... }: let # waybar-systemd = pkgs.writeShellApplication { # name = "waybar-systemd.sh"; # runtimeInputs = [ ]; # text = '' # failed_user="$(systemctl --plain --no-legend --user list-units --state=failed | awk '{ print $1 }')" # failed_system="$(systemctl --plain --no-legend list-units --state=failed | awk '{ print $1 }')" # failed_systemd_count="$(echo -n "$failed_system" | grep -c '^')" # failed_user_count="$(echo -n "$failed_user" | grep -c '^')" # text=$(( failed_systemd_count + failed_user_count )) # if [ "$text" -eq 0 ]; then # printf '{"text": ""}\n' # else # tooltip="" # [ -n "$failed_system" ] && tooltip="Failed system services:\n\n${failed_system}\n\n${tooltip}" # [ -n "$failed_user" ] && tooltip="Failed user services:\n\n${failed_user}\n\n${tooltip}" # tooltip="$(printf "%s" "$tooltip" | perl -pe 's/\n/\\n/g' | perl -pe 's/(?:\\n)+$//')" # printf '{"text": "%s", "tooltip": "%s" }\n' "$text" "$tooltip" # fi # ''; # }; in { programs.waybar = { enable = true; systemd.enable = true; settings = [{ layer = "bottom"; height = 25; position = "top"; margin-top = 0; margin-left = 0; margin-right = 0; margin-bottom = 0; modules-left = [ "sway/workspaces" "sway/mode" ]; modules-right = [ "pulseaudio" "network" "battery" "clock" "tray" ]; "sway/workspaces" = { format = "{name}"; disable-scroll = true; }; "sway/mode" = { format = "{}"; }; tray = { spacing = 10; }; clock = { format = "{: %a %b %d %R}"; }; battery = { states = { warning = 30; critical = 15; }; format = "ac:{capacity}%"; tooltip = true; tooltip-format = "{timeTo} ({capacity}%)"; }; # "custom/systemd" = { # exec = "${waybarSystemd}/bin/waybar-systemd"; # return-type = "json"; # interval = 10; # }; pulseaudio = { format = "vol:{volume}%"; format-bluetooth = "bt:{volume}%"; format-bluetooth-muted = "bt:{volume}%"; format-muted = "vol:{volume}%"; on-click = "pavucontrol"; }; "network" = { format-wifi = "{essid}:{signalStrength}%"; format-ethernet = "{ipaddr}/{cidr}"; format-linked = "{ifname} (No IP)"; format-disconnected = "network unavailable"; format-alt = "{ifname}: {ipaddr}/{cidr}"; tooltip = false; }; }]; }; programs.waybar.style = pkgs.writeText "style.css" '' * { border-radius: 0; border: none; margin: 0; min-height: 0; padding: 0; font-family: Source Code Pro; font-size: 15px; } window#waybar { background-color: #282A36; color: #eee; } #workspaces button { padding: 0 3px; background-color: transparent; color: #eee; } #workspaces button.focused { background-color: #285577; border: 1px solid #4c7899; } #clock, #battery, #network, #pulseaudio, #tray, #mode { padding-left: 10px; padding-right: 10px; } #mode { /* No styles */ } #tray { /* No styles */ } #clock { /* No styles */ } #battery { animation-timing-function: linear; animation-iteration-count: infinite; animation-direction: alternate; } #battery.discharging { color: #90a1ad; } #battery.charging { color: #fffff8; } #battery.warning { border-bottom: 2px solid #ff9e21; } #battery.critical { border-bottom: 2px solid #ff3121; } #network { /* No styles */ } #network.disconnected { color: orange; } #pulseaudio { /* No styles */ } #pulseaudio.muted { color: #90a1ad; } ''; }