139 lines
3.8 KiB
Nix
139 lines
3.8 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
util,
|
|
...
|
|
}:
|
|
# Waybar: a top status bar reading system state at a glance.
|
|
let
|
|
waybarModulesFor =
|
|
position:
|
|
map (module: module.name) (
|
|
lib.sort (a: b: a.order < b.order) (
|
|
lib.filter (module: module.position == position) registeredWaybarModules
|
|
)
|
|
);
|
|
|
|
registeredWaybarModules = lib.mapAttrsToList (
|
|
name: module:
|
|
module
|
|
// {
|
|
inherit name;
|
|
}
|
|
) hostWaybarModules;
|
|
|
|
hostWaybarModules = lib.attrByPath [ config.networking.hostName ] { } config.registry.waybar;
|
|
|
|
registeredWaybarModuleSettings = lib.mapAttrs (_name: module: module.settings) hostWaybarModules;
|
|
|
|
networkStatus = pkgs.writeShellScript "waybar-network-status" ''
|
|
active=$(
|
|
${lib.getExe' pkgs.networkmanager "nmcli"} -t -f DEVICE,TYPE,STATE,CONNECTION device status \
|
|
| ${lib.getExe' pkgs.gawk "awk"} -F: '$3 == "connected" && $2 != "loopback" { print; exit }'
|
|
)
|
|
|
|
if [ -z "$active" ]; then
|
|
${lib.getExe pkgs.jq} -cn \
|
|
--arg text "${util.glyph "f127"} off" \
|
|
--arg tooltip "Network disconnected" \
|
|
--arg class "disconnected" \
|
|
'{ text: $text, tooltip: $tooltip, class: $class }'
|
|
exit 0
|
|
fi
|
|
|
|
IFS=: read -r device type _state connection <<< "$active"
|
|
|
|
case "$type" in
|
|
wifi) icon="${util.glyph "f1eb"}" ;;
|
|
ethernet) icon="LAN" ;;
|
|
*) icon="NET" ;;
|
|
esac
|
|
|
|
ipaddr=$(${lib.getExe' pkgs.iproute2 "ip"} -4 -o addr show dev "$device" | ${lib.getExe' pkgs.gawk "awk"} '{ print $4; exit }')
|
|
|
|
${lib.getExe pkgs.jq} -cn \
|
|
--arg text "$icon $connection" \
|
|
--arg tooltip "$device: ''${ipaddr:-no IPv4}" \
|
|
--arg class "$type" \
|
|
'{ text: $text, tooltip: $tooltip, class: $class }'
|
|
'';
|
|
|
|
in
|
|
{
|
|
options.modules.desktop.session.waybar.enable = lib.mkEnableOption "the Waybar status bar";
|
|
|
|
config = lib.mkIf config.modules.desktop.session.waybar.enable {
|
|
# A symbols font backs the module glyphs, so pango falls back to it for the
|
|
# codepoints Stylix's monospace font does not carry.
|
|
fonts.packages = [ pkgs.nerd-fonts.symbols-only ];
|
|
|
|
home-manager.users.${config.user.name}.programs.waybar = {
|
|
enable = true;
|
|
|
|
# A user service bound to graphical-session.target, which uwsm activates,
|
|
# so the bar comes up with the session and no compositor exec-once.
|
|
systemd.enable = true;
|
|
|
|
settings.mainBar = lib.mkMerge [
|
|
{
|
|
layer = "top";
|
|
position = "top";
|
|
height = 30;
|
|
spacing = 8;
|
|
margin-right = 8;
|
|
|
|
modules-left = waybarModulesFor "left";
|
|
modules-center = waybarModulesFor "center";
|
|
modules-right = waybarModulesFor "right";
|
|
}
|
|
registeredWaybarModuleSettings
|
|
];
|
|
};
|
|
|
|
registry.waybar.${config.networking.hostName} = {
|
|
clock = {
|
|
position = "center";
|
|
order = 10;
|
|
settings = {
|
|
format = "{:%a %d %b %H:%M}";
|
|
tooltip-format = "<tt>{calendar}</tt>";
|
|
calendar = {
|
|
mode = "month";
|
|
# Underline the current day so it stands out in the grid.
|
|
format.today = "<b><u>{}</u></b>";
|
|
};
|
|
};
|
|
};
|
|
|
|
"custom/network" = {
|
|
order = 60;
|
|
settings = {
|
|
return-type = "json";
|
|
exec = "${networkStatus}";
|
|
interval = 5;
|
|
};
|
|
};
|
|
|
|
battery = {
|
|
order = 70;
|
|
settings = {
|
|
format = "{icon} {capacity}%";
|
|
format-charging = "${util.glyph "f0e7"} {capacity}%";
|
|
format-icons = [
|
|
(util.glyph "f244")
|
|
(util.glyph "f243")
|
|
(util.glyph "f242")
|
|
(util.glyph "f241")
|
|
(util.glyph "f240")
|
|
];
|
|
states = {
|
|
warning = 20;
|
|
critical = 10;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
}
|