{ lib , pkgs , config , ... }: with lib; let cfg = config.eboskma.programs.waybar; wb-dunst = pkgs.writeShellScriptBin "wb-dunst" '' COUNT=$(${pkgs.dunst}/bin/dunstctl count waiting) ENABLED=" " DISABLED=" " if [[ ''${COUNT} != 0 ]]; then DISABLED=" ''${COUNT}"; fi if ${pkgs.dunst}/bin/dunstctl is-paused | grep -q "false" ; then echo "''${ENABLED}"; else echo "''${DISABLED}"; fi ''; in { options.eboskma.programs.waybar.enable = mkEnableOption "Enable waybar"; config = mkIf cfg.enable { programs.waybar = { enable = true; systemd.enable = true; settings = [ { layer = "top"; position = "top"; height = 32; modules-left = [ "sway/workspaces" "sway/mode" "custom/now_playing" ]; modules-center = [ "sway/window" ]; modules-right = [ "network" "memory" "cpu" "temperature" "custom/keyboard-layout" "pulseaudio" "tray" "clock#date" "clock#time" "idle_inhibitor" "custom/notifications" ]; "clock#time" = { interval = 1; format = "{:%H:%M:%S}"; tooltip = false; }; "clock#date" = { interval = 10; format = " {:%e %b %Y}"; tooltip-format = "{:%e %B %Y}"; }; "cpu" = { interval = 5; format = "﬙ {usage}% ({load})"; states = { warning = 70; critical = 90; }; }; "custom/keyboard-layout" = { exec = "swaymsg -t get_inputs | grep -m1 'xkb_active_layout_name' | cut -d '\"' -f4"; interval = 30; format = " {}"; # Icon: keyboard # Signal sent by Sway key binding (~/.config/sway/key-bindings) signal = 1; # SIGHUP tooltip = false; }; "memory" = { interval = 5; format = " {}%"; # Icon: memory states = { warning = 70; critical = 90; }; }; "network" = { interval = 5; format-wifi = "直 {essid} ({signalStrength}%)"; # Icon: wifi format-ethernet = " {ifname}: {ipaddr}/{cidr}"; # Icon: ethernet format-disconnected = "⚠ Disconnected"; tooltip-format = "{ifname}: {ipaddr}"; }; "sway/mode" = { format = " {}"; # Icon: expand-arrows-alt tooltip = false; }; # TODO: package as nix thingy "custom/now_playing" = { exec = "${pkgs.ha-now-playing}/bin/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token-file /run/secrets/ha_now_playing_token"; exec-on-event = false; format = " ♪ {}"; restart-interval = 1; return-type = "json"; on-click = "${pkgs.ha-now-playing}/bin/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token-file /run/secrets/ha_now_playing_token play-pause"; on-scroll-down = "${pkgs.ha-now-playing}/bin/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token-file /run/secrets/ha_now_playing_token volume-up"; on-scroll-up = "${pkgs.ha-now-playing}/bin/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token-file /run/secrets/ha_now_playing_token volume-down"; }; "sway/window" = { format = "{}"; max-length = 120; }; "sway/workspaces" = { all-outputs = false; disable-scroll = true; format = "{icon} {name}"; format-icons = { "urgent" = ""; "focused" = ""; "default" = ""; }; }; "pulseaudio" = { #scroll-step = 1; format = "{icon} {volume}%"; format-bluetooth = "{icon} {volume}%"; format-muted = "婢"; format-icons = { headphones = ""; handsfree = ""; headset = ""; phone = ""; portable = ""; car = ""; default = [ "奄" "奔" "墳" ]; }; on-click = "pavucontrol"; }; "temperature" = { hwmon-path = "/sys/class/hwmon/hwmon2/temp1_input"; critical-threshold = 80; interval = 5; format = "{icon} {temperatureC}°C"; format-icons = [ "" # Icon = temperature-empty "" # Icon = temperature-quarter "" # Icon = temperature-half "" # Icon = temperature-three-quarters "" # Icon = temperature-full ]; tooltip = true; }; "tray" = { icon-size = 21; spacing = 10; }; "idle_inhibitor" = { format = "{icon}"; format-icons = { activated = "﯎"; deactivated = "﯏"; }; }; "custom/notifications" = { exec = "${pkgs.swaynotificationcenter}/bin/swaync-client --subscribe-waybar"; on-click = "${pkgs.swaynotificationcenter}/bin/swaync-client --toggle-panel --skip-wait"; on-click-right = "${pkgs.swaynotificationcenter}/bin/swaync-client --toggle-dnd --skip-wait"; return-type = "json"; tooltip = false; format = "{icon}"; format-icons = { notification = ""; none = ""; dnd-notification = ""; dnd-none = ""; }; escape = true; }; } ]; style = '' @keyframes blink-warning { 70% { color: white; } to { color: white; background-color: orange; } } @keyframes blink-critical { 70% { color: white; } to { color: white; background-color: red; } } * { border: none; border-radius: 0; min-height: 0; margin: 0; padding: 0; } #waybar { background: rgba(0, 0, 0, 0.8); color: white; font-family: "MesloLGM Nerd Font", sans-serif; font-size: 13px; } #battery, #clock, #cpu, #custom-keyboard-layout, #memory, #mode, #network, #pulseaudio, #temperature, #tray, #custom-now_playing, #idle_inhibitor { padding-left: 10px; padding-right: 10px; } #battery { animation-timing-function: linear; animation-iteration-count: infinite; animation-direction: alternate; } #battery.warning { color: orange; } #battery.critical { color: red; } #battery.warning.discharging { animation-name: blink-warning; animation-duration: 3s; } #battery.critical.discharging { animation-name: blink-critical; animation-duration: 2s; } #clock { font-weight: bold; } #cpu { /* No styles */ } #cpu.warning { color: orange; } #cpu.critical { color: red; } #memory { animation-timing-function: linear; animation-iteration-count: infinite; animation-direction: alternate; } #memory.warning { color: orange; } #memory.critical { color: red; animation-name: blink-critical; animation-duration: 2s; } #mode { background: #64727D; border-top: 2px solid white; /* To compensate for the top border and still have vertical centering */ padding-bottom: 2px; } #network { /* No styles */ } #network.disconnected { color: orange; } #pulseaudio { /* No styles */ } #pulseaudio.muted { /* No styles */ } #custom-spotify { color: rgb(102, 220, 105); } #temperature { /* No styles */ } #temperature.critical { color: red; } #tray { /* No styles */ } #window { font-weight: bold; } #workspaces button { border-top: 2px solid transparent; /* To compensate for the top border and still have vertical centering */ padding-bottom: 2px; padding-left: 10px; padding-right: 10px; color: #888888; } #workspaces button.focused { border-color: #4c7899; color: white; background-color: #285577; } #workspaces button.urgent { border-color: #c9545d; color: #c9545d; } #idle_inhibitor { background-color: transparent; font-weight: bold; padding-right: 10px; } #idle_inhibitor.activated { background-color: #c9545d; color: #ffffff; } #custom-now_playing { font-weight: bold; } #custom-notifications { padding: 0 10px; } ''; }; }; }