{ config, lib, pkgs, inputs, ... }: let fuzzel-command = config.nathan.config.desktop.fuzzel-command; targets = config.nathan.config.desktop.targets; hyprland = config.nathan.programs.hyprland.enable; in lib.mkMerge [ # Hyprland specific configuration (lib.mkIf hyprland { programs.waybar.settings.mainBar = { modules-center = [ "custom/launcher" "wlr/workspaces" "custom/media" # "hyprland/window" "idle_inhibitor" "pulseaudio" "network" "cpu" "memory" # "temperature" "tray" "custom/notification" "clock" # "custom/power" ]; }; }) # General configuration (lib.mkIf hyprland { ######################### ## Waybar ######################### # https://github.com/DN-debug/waybar-examples/tree/main/waybar-examples/sway programs.waybar = { enable = true; package = (inputs.nixpkgs-unstable.legacyPackages."${pkgs.system}".waybar.override { withMediaPlayer = true; }).overrideAttrs (old: { mesonFlags = old.mesonFlags ++ [ "-Dexperimental=true" ]; }); systemd = { enable = false; }; settings = { mainBar = { layer = "top"; position = "top"; height = 30; spacing = 0; margin-top = 5; margin-bottom = 0; "custom/launcher" = { format = ""; on-click = fuzzel-command + " --prompt='❯ ' "; on-click-right = "killall fuzzel"; }; "idle_inhibitor" = { format = "{icon}"; format-icons = { activated = ""; deactivated = ""; }; }; pulseaudio = { scroll-step = 1; format = "{volume}% {icon}"; format-bluetooth = "{volume}% {icon}"; format-bluetooth-muted = "{icon} {format_source}"; format-muted = "{format_source}"; format-source = ""; format-source-muted = ""; format-icons = { headphone = ""; hands-free = ""; headset = ""; phone = ""; portable = ""; car = ""; default = [ "" "" "" ]; }; on-click = "pavucontrol"; ignored-sinks = [ "Easy Effects Sink" ]; }; network = { # // "interface": "wlp2*", // (Optional) To force the use of this interface format-wifi = "{essid} ({signalStrength}%) "; format-ethernet = "Connected  "; tooltip-format = "{ifname} via {gwaddr} "; format-linked = "{ifname} (No IP) "; format-disconnected = "Disconnected ⚠"; format-alt = "{ifname}: {ipaddr}/{cidr}"; on-click-right = "bash ~/.config/rofi/wifi_menu/rofi_wifi_menu"; }; cpu = { format = "{usage}% "; tooltip = false; }; memory = { format = "{}% ({used}GB/{total}GB) "; }; "tray" = { icon-size = 20; spacing = 10; }; "clock" = { format = "{:%I:%M%p %Y-%m-%d}"; }; "custom/media" = { format = "{icon} {}"; return-type = "json"; max-length = 50; format-icons = { spotify = " "; firefox = " "; mopidy = " "; default = " "; }; escape = true; exec = "waybar-mediaplayer.py 2> /dev/null"; on-click = "playerctl play-pause"; }; "custom/notification" = { tooltip = false; format = "{icon}"; format-icons = { notification = "  "; none = "  "; dnd-notification = "  "; dnd-none = ""; inhibited-notification = "  "; inhibited-none = "  "; dnd-inhibited-notification = "  "; dnd-inhibited-none = "  "; }; return-type = "json"; exec-if = "which swaync-client"; exec = "swaync-client -swb"; on-click = "swaync-client -t -sw"; on-click-right = "swaync-client -d -sw"; escape = true; }; }; }; style = '' * { border: none; border-radius: 0px; font-family: Roboto, Helvetica, Arial, sans-serif; font-size: 12px; min-height: 0; } window#waybar { background-color: transparent; color: #ffffff; transition-property: background-color; transition-duration: .5s; } window#waybar.hidden { opacity: 0.2; } #workspaces button { background: #1f1f1f; color: #ffffff; border-radius: 20px; } /* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */ #workspaces button:hover { background: lightblue; color: black; border-bottom: 3px solid #ffffff; } #workspaces button.active { background: #3f3f3f; } #workspaces button.active:hover { background: lightblue; color: black; border-bottom: 3px solid #ffffff; } #workspaces button.urgent { background-color: #eb4d4b; } #mode { background-color: #64727D; border-bottom: 3px solid #ffffff; } #clock, #battery, #cpu, #memory, #disk, #temperature, #backlight, #network, #pulseaudio, #custom-media, #custom-launcher, #custom-power, #tray, #mode, #idle_inhibitor, #mpd { padding: 0 10px; color: black; } #mpd { background-color: #8EC5FC; background-image: linear-gradient(62deg, #8EC5FC 0%, #E0C3FC 100%); color: black; border-radius: 20px; margin-right: 5px; } #window, #workspaces { margin: 0px 4px; } /* If workspaces is the leftmost module, omit left margin */ .modules-left > widget:first-child > #workspaces { margin-left: 0px; } /* If workspaces is the rightmost module, omit right margin */ .modules-right > widget:last-child > #workspaces { margin-right: 0px; } #clock { background-color: #FA8BFF; background-image: linear-gradient(-45deg, #FA8BFF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; border-radius: 0px 20px 20px 0px; margin-right: 4px; } #battery { background-color: #ffffff; color: #000000; } #battery.charging, #battery.plugged { color: #ffffff; background-color: #26A65B; } @keyframes blink { to { background-color: #ffffff; color: #000000; } } #battery.critical:not(.charging) { background-color: #f53c3c; color: #ffffff; animation-name: blink; animation-duration: 0.5s; animation-timing-function: linear; animation-iteration-count: infinite; animation-direction: alternate; } label:focus { background-color: #000000; } #cpu { background-color: #FA8BFF; background-image: linear-gradient(45deg, #2BD2FF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; } #custom-notification { background-color: #FA8BFF; background-image: linear-gradient(45deg, #2BD2FF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; } #memory { background-color: #FA8BFF; background-image: linear-gradient(45deg, #2BD2FF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; } #disk { background-color: #FA8BFF; background-image: linear-gradient(45deg, #2BD2FF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; } #backlight { background-color: #FA8BFF; background-image: linear-gradient(45deg, #2BD2FF 0%, #2BD2FF 52%, #2BD2FF 90%); } #network { background-color: #FA8BFF; background-image: linear-gradient(45deg, #2BD2FF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; } #network.disconnected { background-color: #FA8BFF; background-image: linear-gradient(45deg, #2BD2FF 0%, #2BD2FF 52%, #2BD2FF 90%); color: red; } #pulseaudio { background-color: #FA8BFF; background-image: linear-gradient(45deg, #2BD2FF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; } #pulseaudio.muted { background-color: #FA8BFF; background-image: linear-gradient(45deg, #2BD2FF 0%, #2BD2FF 52%, #2BD2FF 90%); color: red; } #custom-media { background-color: #8EC5FC; background-image: linear-gradient(62deg, #8EC5FC 0%, #E0C3FC 100%); color: black; border-radius: 20px; margin-right: 5px; } #custom-media { background-color: #8EC5FC; background-image: linear-gradient(62deg, #8EC5FC 0%, #E0C3FC 100%); color: black; border-radius: 20px; margin-right: 5px; } #custom-media.custom-spotify { background-color: #8EC5FC; background-image: linear-gradient(62deg, #8EC5FC 0%, #E0C3FC 100%); color: black; border-radius: 20px; margin-right: 5px; } #custom-media.custom-vlc { background-color: #8EC5FC; background-image: linear-gradient(62deg, #8EC5FC 0%, #E0C3FC 100%); color: black; border-radius: 20px; margin-right: 5px; } #custom-power{ background-color: #FA8BFF; background-image: linear-gradient(45deg, #FA8BFF 0%, #2BD2FF 52%, #2BD2FF 90%); font-size: 16px; border-radius: 19px; } #custom-launcher{ background-color: #FA8BFF; background-image: linear-gradient(-45deg, #FA8BFF 0%, #2BD2FF 52%, #2BD2FF 90%); font-size: 18px; border-radius: 20px; } #custom-updater { background-color: #FA8BFF; background-image: linear-gradient(45deg, #2BD2FF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; } #temperature { background-color: #FA8BFF; background-image: linear-gradient(45deg, #2BD2FF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; } #temperature.critical { background-color: #eb4d4b; } #tray { background-color: #FA8BFF; background-image: linear-gradient(-45deg, #2BD2FF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; } #tray > .passive { -gtk-icon-effect: dim; background-color: #FA8BFF; background-image: linear-gradient(-45deg, #FA8BFF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; } #tray > .needs-attention { -gtk-icon-effect: highlight; background-color: #FA8BFF; background-image: linear-gradient(-45deg, #FA8BFF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; } #idle_inhibitor { background-color: #FA8BFF; background-image: linear-gradient(45deg, #FA8BFF 0%, #2BD2FF 52%, #2BD2FF 90%); border-radius: 20px 0px 0px 20px; } #idle_inhibitor.activated { background-color: #FA8BFF; background-image: linear-gradient(45deg, #FA8BFF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; border-radius: 20px 0px 0px 20px; } #language { background-color: #FA8BFF; background-image: linear-gradient(45deg, #2BD2FF 0%, #2BD2FF 52%, #2BD2FF 90%); color: black; min-width: 16px; } #keyboard-state { background: #97e1ad; color: #000000; min-width: 16px; } #keyboard-state > label { padding: 0px 5px; } #keyboard-state > label.locked { background: rgba(0, 0, 0, 0.2); } ''; }; # Override the service to run during graphical-session-pre.target systemd.user.services.waybar = { Unit = { Description = "Highly customizable Wayland bar for Sway and Wlroots based compositors."; Documentation = "https://github.com/Alexays/Waybar/wiki"; Before = [ "tray.target" ]; }; Service = { ExecStart = "${config.programs.waybar.package}/bin/waybar"; ExecReload = "${pkgs.coreutils}/bin/kill -SIGUSR2 $MAINPID"; ExecStartPost = "${pkgs.coreutils}/bin/sleep 1"; Restart = "on-failure"; KillMode = "mixed"; }; Install = { WantedBy = targets; }; }; ######################### ## Create tray target to fix some things ######################### systemd.user.targets.tray = { Unit = { Description = "Home Manager System Tray"; Requires = [ "graphical-session-pre.target" "waybar.service" ]; After = [ "waybar.service" ]; }; }; }) ]