config/modules/home/apps/helpers/waybar/default.nix
2025-07-27 16:17:28 -04:00

310 lines
10 KiB
Nix

{
options,
config,
lib,
inputs,
pkgs,
...
}:
with lib;
with lib.custom; let
cfg = config.apps.helpers.waybar;
in {
options.apps.helpers.waybar = with types; {
enable = mkBoolOpt false "Enable WayBar";
};
config = mkIf (cfg.enable && !pkgs.stdenv.isDarwin) {
programs.waybar = {
enable = true;
systemd.enable = true;
systemd.target = "graphical-session.target";
style = ''
/* Custom colors from lib/theme/default.nix */
@define-color rosewater ${colors.rosewater.hex};
@define-color flamingo ${colors.flamingo.hex};
@define-color pink ${colors.pink.hex};
@define-color mauve ${colors.mauve.hex};
@define-color red ${colors.red.hex};
@define-color maroon ${colors.maroon.hex};
@define-color peach ${colors.peach.hex};
@define-color yellow ${colors.yellow.hex};
@define-color green ${colors.green.hex};
@define-color teal ${colors.teal.hex};
@define-color sky ${colors.sky.hex};
@define-color sapphire ${colors.sapphire.hex};
@define-color blue ${colors.blue.hex};
@define-color lavender ${colors.lavender.hex};
@define-color text ${colors.text.hex};
@define-color subtext1 ${colors.subtext1.hex};
@define-color subtext0 ${colors.subtext0.hex};
@define-color overlay2 ${colors.overlay2.hex};
@define-color overlay1 ${colors.overlay1.hex};
@define-color overlay0 ${colors.overlay0.hex};
@define-color surface2 ${colors.surface2.hex};
@define-color surface1 ${colors.surface1.hex};
@define-color surface0 ${colors.surface0.hex};
@define-color base ${colors.base.hex};
@define-color mantle ${colors.mantle.hex};
@define-color crust ${colors.crust.hex};
${builtins.readFile ./mullvad-style.css}
${builtins.readFile ./style.css}
'';
settings = let
# Import the Mullvad scripts
mullvad-status = import ./mullvad-status.nix {inherit pkgs;};
mullvad-server-list = import ./mullvad-server-list.nix {inherit pkgs;};
mullvad-menu = import ./mullvad-menu.nix {inherit pkgs;};
# Script to toggle Mullvad connection
mullvad-toggle = pkgs.writeShellScriptBin "mullvad-toggle" ''
set -euo pipefail
if mullvad status | grep -q "Connected"; then
mullvad disconnect
else
mullvad connect
fi
# Optional: trigger a Waybar refresh if needed, though interval should handle it
# pkill -SIGRTMIN+8 waybar
'';
cava = pkgs.writeShellScriptBin "cava" "${builtins.readFile ./bar.sh}";
in {
mainBar = {
layer = "bottom";
position = "top";
height = 40;
spacing = 2;
exclusive = true;
"gtk-layer-shell" = true;
passthrough = false;
"fixed-center" = true;
"modules-left" = ["hyprland/workspaces" "hyprland/window" "niri/workspaces" "niri/window" "network#speed" "custom/cava-system" "custom/cava-tt"];
"modules-center" = ["custom/spotify"];
"modules-right" = [
"cpu"
"memory"
"temperature"
"custom/gpu-usage"
"custom/gpu-mem"
"custom/gpu-temp"
"pulseaudio"
"custom/mullvad"
"custom/weather"
"clock"
"clock#simpleclock"
"tray"
"custom/notification"
"custom/power"
];
"custom/spotify" = {
format = "{}";
"return-type" = "json";
"on-click" = "${lib.getExe inputs.ciderd.packages.${pkgs.system}.default} play-pause";
"on-click-right" = "${lib.getExe inputs.ciderd.packages.${pkgs.system}.default} like";
"on-click-middle" = "${lib.getExe inputs.ciderd.packages.${pkgs.system}.default} skip";
exec = "${lib.getExe inputs.ciderd.packages.${pkgs.system}.default} monitor";
};
"custom/mullvad" = {
format = "{}";
return-type = "json";
interval = 1;
exec = "${mullvad-status}/bin/mullvad-status-waybar";
"on-click" = "${mullvad-toggle}/bin/mullvad-toggle";
"on-click-right" = "${mullvad-menu}/bin/mullvad-menu";
tooltip = true;
};
mpd = {
format = "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {title}";
"format-disconnected" = "Disconnected ";
"format-stopped" = "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ";
"interval" = 10;
"consume-icons" = {
"on" = " ";
};
"random-icons" = {
"off" = "<span color=\"#f53c3c\"></span> ";
"on" = " ";
};
"repeat-icons" = {
"on" = " ";
};
"single-icons" = {
"on" = "1 ";
};
"state-icons" = {
"paused" = "";
"playing" = "";
};
"tooltip-format" = "MPD (connected)";
"tooltip-format-disconnected" = "";
};
mpris = {
player = "spotify";
"dynamic-order" = ["artist" "title"];
format = "{player_icon} {dynamic}";
"format-paused" = "{status_icon} <i>{dynamic}</i>";
"status-icons" = {
paused = "";
};
"player-icons" = {
default = "";
};
};
"custom/cava-system" = {
format = "{}";
exec = "${cava}/bin/cava alsa_output.usb-MOTU_M4_M4MA03F7DV-00.HiFi__Line1__sink.monitor";
};
"custom/cava-tt" = {
format = "{}";
exec = "${cava}/bin/cava cava-line-in.monitor";
};
"custom/weather" = {
"format" = "{}°F";
interval = 3600;
exec = "${lib.getExe pkgs.wttrbar} --location 'Holland,MI' --fahrenheit --mph";
return-type = "json";
};
"custom/gpu-temp" = {
interval = 10;
exec = "nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits";
format = "{}°C ";
tooltip = false;
};
"custom/gpu-mem" = {
interval = 10;
exec = "nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits | awk '{printf \"%.1f\", $1/1024}'";
format = "{}Gi";
tooltip = false;
};
"custom/gpu-usage" = {
interval = 2;
exec = "nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits";
format = "{}%";
tooltip = false;
};
"network#speed" = {
interval = 1;
format = "{ifname}%%";
format-wifi = " {bandwidthDownBytes} {bandwidthUpBytes}";
format-ethernet = " {bandwidthDownBytes} {bandwidthUpBytes}";
format-disconnected = "󰌙";
tooltip-format = "{ipaddr}";
format-linked = "󰈁 {ifname} (No IP)";
tooltip-format-wifi = "{essid} {icon} {signalStrength}%";
tooltip-format-ethernet = "{ifname} 󰌘";
tooltip-format-disconnected = "󰌙 Disconnected";
max-length = 22;
min-length = 20;
format-icons = ["󰤯" "󰤟" "󰤢" "󰤥" "󰤨"];
};
"hyprland/workspaces" = {
"on-click" = "activate";
format = "{id}";
"all-outputs" = true;
"disable-scroll" = false;
"active-only" = false;
};
"hyprland/window" = {
format = "{title}";
};
tray = {
"show-passive-items" = true;
spacing = 2;
};
"clock#simpleclock" = {
tooltip = false;
format = "{:%H:%M}";
};
"temperature" = {
hwmon-path-abs = "/sys/devices/platform/asus-ec-sensors/hwmon/hwmon3";
input_filename = "temp2_input";
critical-threshold = 70;
format = "{temperatureC}°C ";
format-critical = "󰸁 {temperatureC}°C";
};
clock = {
format = "{:L%a %d %b}";
calendar = {
format = {
days = "<span weight='normal'>{}</span>";
months = "<span color='#cdd6f4'><b>{}</b></span>";
today = "<span color='#f38ba8' weight='700'><u>{}</u></span>";
weekdays = "<span color='#f9e2af'><b>{}</b></span>";
weeks = "<span color='#a6e3a1'><b>W{}</b></span>";
};
mode = "month";
"mode-mon-col" = 1;
"on-scroll" = 1;
};
"tooltip-format" = "<span color='#cdd6f4' font='Lexend 16'><tt><small>{calendar}</small></tt></span>";
};
cpu = {
format = "{usage}%";
tooltip = true;
interval = 1;
};
memory = {
interval = 1;
format = "{used:0.1f}Gi";
};
pulseaudio = {
format = "{icon} {volume}%";
"format-muted" = "";
"format-icons" = {
headphone = "";
default = ["" ""];
};
"on-click" = "pavucontrol";
};
"custom/sep" = {
format = "|";
tooltip = false;
};
"custom/power" = {
tooltip = false;
"on-click" = "wlogout -p layer-shell &";
format = "";
};
"custom/notification" = {
escape = true;
exec = "swaync-client -swb";
"exec-if" = "which swaync-client";
format = "{icon}";
"format-icons" = {
none = "󰅺";
notification = "󰡟";
};
"on-click" = "sleep 0.1 && swaync-client -t -sw";
"return-type" = "json";
tooltip = false;
};
};
};
};
};
}