{ settings ? [ ], }: { osConfig, config, username, lib, pkgs, ... }: let inherit (lib) optionalString; mkWall = import ../scripts/mkWall.nix { inherit config pkgs; }; rofiWall = import ../scripts/rofiwall.nix { inherit config pkgs; }; # Change Wallpaper wallRand = pkgs.writeShellScript "wallRand" '' mapfile -t wallpapers < <(find /tmp/wall_cache -type f) count="''${#wallpapers[@]}" random_index=$(( RANDOM % count )) selected="''${wallpapers[$random_index]}" if [ ! -f "$selected" ]; then echo "File not exist: $selected" exit 1 fi ${config.services.swww.package}/bin/swww img $selected --transition-fps 45 --transition-duration 1 --transition-type random ''; rbwSelector = import ../scripts/rbwSelector.nix { inherit pkgs; }; toggleRecord = pkgs.callPackage ../scripts/record.nix { }; in { home.packages = [ mkWall ]; # For wallpapers systemd.user.tmpfiles.rules = [ "d /tmp/wall_cache 700 ${username} -" ]; # === gamemode === # systemd.user.services.gamemode = lib.mkIf osConfig.programs.gamemode.enable { Service = { ExecStart = "${pkgs.gamemode}/bin/gamemoded -r"; }; }; # === waybar === # systemd.user.services.waybar = lib.mkIf config.programs.waybar.enable { Unit = { PartOf = [ "graphical-session.target" ]; After = [ "graphical-session.target" ]; }; }; programs.waybar = { enable = true; style = let borderRadius = "6px"; border = "1px solid @fg-bg"; gap = "4px"; in lib.mkForce # css '' @define-color main #ebdbb2; @define-color bg-bg rgba(0, 0, 0, 0); @define-color fg-bg alpha(#fff, 0.05); * { font-family: ${osConfig.stylix.fonts.sansSerif.name}; min-height: 0; font-size: ${toString (osConfig.stylix.fonts.sizes.desktop + 2)}; font-feature-settings: '"zero", "ss01", "ss02", "ss03", "ss04", "ss05", "cv31"'; transition-property: all; transition-duration: 0.3s; } /* Main bar */ window#waybar { background-color: @bg-bg; } window#waybar > .horizontal { padding: ${gap}; } window#waybar.hidden { opacity: 0.5; } /* Set transparent if empty */ window#waybar .empty { background-color: transparent; border-color: transparent; } /* tooltip */ tooltip { background-color: @fg-bg; border: ${border}; border-radius: ${borderRadius}; } tooltip label { padding: 4px 10px; color: @main; } box.module, label.module, #gamemode { background: @fg-bg; color: @main; border-radius: ${borderRadius}; border: ${border}; padding: 0px 12px; } /* Gamemode center icon */ #gamemode { padding-right: 6px; } box.module button:hover { background: shade(@fg-bg, 1.5); } label:hover { background: shade(@fg-bg, 1.5); } .modules-left .module { margin-right: ${gap}; } .modules-right .module { margin-left: ${gap}; } .modules-center .module { background: transparent; border-color: transparent; } /* Workspaces */ #workspaces { padding-left: 2px; padding-right: 2px; } #workspaces button { border-radius: 16px; padding: 0px 6px; } /* Taskbar */ #taskbar { background: transparent; border-color: transparent; } /* Group */ #cpu { border-top-right-radius: 0; border-bottom-right-radius: 0; padding-right: 0; border-right: none; } #memory { border-top-left-radius: 0; border-bottom-left-radius: 0; margin-left: 0; border-left: none; } #temperature.critical { background-color: red; } #battery.good { color: #ebdbb2; } #battery.warning { color: #eed49f; } #battery.critical { color: #ee99a0; } #battery.charging, #battery.plugged { color: #a6da95; } ''; settings = let commonConfig = { layer = "top"; exclusive = true; passthrough = false; position = "top"; fixed-center = true; ipc = true; margin-top = 0; margin-left = 0; margin-right = 0; margin-bottom = 0; modules-center = [ "hyprland/window" ]; }; modulesConfig = let terminalRun = "${config.programs.ghostty.package}/bin/ghostty -e"; in { "hyprland/workspaces" = { active-only = false; all-outputs = true; format = "{icon}"; show-special = false; on-click = "activate"; on-scroll-up = "hyprctl dispatch workspace e+1"; on-scroll-down = "hyprctl dispatch workspace e-1"; persistent-workspaces = { "1" = [ ]; "2" = [ ]; "3" = [ ]; "4" = [ ]; }; format-icons = { active = ""; default = ""; }; }; clock = { format = "󰥔 {:%H:%M 󰃭 %d/%m}"; tooltip-format = "{:%A %d %B %Y}"; }; actions = { on-click-right = "mode"; on-click-forward = "tz_up"; on-click-backward = "tz_down"; on-scroll-up = "shift_up"; on-scroll-down = "shift_down"; }; "custom/os" = { format = "󱄅"; on-click = "wlogout --protocol layer-shell"; }; cpu = { format = " {usage}%"; max-length = 20; interval = 5; on-click-right = "${terminalRun} btop"; }; "hyprland/window" = { format = "{}"; max-length = 40; separate-outputs = true; offscreen-css = true; offscreen-css-text = "(inactive)"; rewrite = { "nvim . (.*)" = " $1"; "(.*) - Visual Studio Code" = " $1"; "\\(\\d+\\) Discord (.*)" = " $1"; # Firefox "(.*) - YouTube — Mozilla Firefox" = " $1"; "(.*)\\.pdf — Mozilla Firefox" = " $1"; "(.*) — Mozilla Firefox" = " $1"; "(.*) - YouTube Music — Mozilla Firefox" = "󰎆 $1"; # Firefox Nightly "(.*) - YouTube — Firefox Nightly" = " $1"; "(.*)\\.pdf — Firefox Nightly" = " $1"; "(.*) — Firefox Nightly" = " $1"; "(.*) - YouTube Music — Firefox Nightly" = "󰎆 $1"; # Zen "(.*) - YouTube — Zen Browser" = " $1"; "(.*) - YouTube Music — Zen Browser" = "󰎆 $1"; "(.*) — Zen Browser" = " $1"; "(.*) - VLC media player" = " $1"; }; }; memory = { interval = 30; format = " {used:0.1f}GB/{total:0.1f}G"; format-alt-click = "click"; tooltip = true; tooltip-format = "{used:0.1f}GB/{total:0.1f}G"; on-click-right = "${terminalRun} btop"; }; mpris = { interval = 10; format = " {status_icon} {title} | {artist} "; format-paused = " {status_icon} {title} | {artist} "; on-click = "playerctl play-pause"; on-click-right = "playerctl next"; scroll-step = 5.0; smooth-scrolling-threshold = 1; status-icons = { paused = "󰐎"; playing = "󰎇"; stopped = ""; }; max-length = 30; }; pulseaudio = { format = "{icon} {volume}%"; format-bluetooth = "󰂰 {volume}%"; format-muted = " Muted"; format-icons = { default = [ "" "" " " " " ]; ignored-sinks = [ "Easy Effects Sink" ]; }; scroll-step = 5.0; on-click = "pavucontrol -t 3"; tooltip-format = "{icon} {desc} | {volume}%"; smooth-scrolling-threshold = 1; }; temperature = { interval = 10; tooltip = true; hwmon-path = [ "/sys/class/hwmon/hwmon1/temp1_input" "/sys/class/thermal/thermal_zone0/temp" ]; critical-threshold = 82; format-critical = " {temperatureC}°C"; format = "{icon} {temperatureC}°C"; format-icons = [ "" "" "" "" ]; on-click-right = "kitty -c ~/.config/kitty/kitty.conf --title btop sh -c 'btop'"; }; "custom/swaync" = { tooltip = true; 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 = "sleep 0.1 && swaync-client -t -sw"; on-click-right = "swaync-client -d -sw"; escape = true; }; "wlr/taskbar" = { format = " {icon} "; icon-size = 20; all-outputs = false; tooltip-format = "{title}"; on-click = "activate"; on-click-middle = "close"; ignore-list = [ "rofi" "firefox" "firefox-nightly" "zen" "kitty" "jetbrains-studio" "Brave-browser" "Spotify" "nemo" "vlc" "com.mitchellh.ghostty" "code" ".virt-manager-wrapped" "virt-manager" "steam_app_*" "obsidian" ]; }; "custom/cava" = { exec = "~/.config/scripts/waybarCava.sh"; format = "{}"; on-click = "${terminalRun} cava"; }; battery = let fullAt = if osConfig.services.tlp.enable then 80 else 96; in { full-at = fullAt; states = { good = fullAt; warning = 30; critical = 15; }; format = "{icon} {capacity}%"; format-icons = [ "󰂎" "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ]; format-charging = "󰂄 {capacity}%"; format-plugged = "󰂄 {capacity}%"; format-alt = "{icon} {time}"; }; network = { format = "{ifname}"; format-wifi = "󰤨"; format-ethernet = "󰈀"; format-disconnected = "󰤭"; tooltip-format = "{ifname} via {gwaddr}"; tooltip-format-wifi = "󰤢 {essid}: {signalStrength}%"; tooltip-format-ethernet = "{ifname} via {gwaddr}"; tooltip-format-disconnected = "Disconnected"; max-length = 50; interval = 5; on-click = "~/.config/scripts/rofiWifi.sh"; }; idle_inhibitor = { format = "{icon}"; format-icons = { activated = "󰅶"; deactivated = "󰾫"; }; }; "custom/wireguard" = { format = "{icon}"; format-icons = { connected = "󰒘"; disconnected = ""; }; exec = "~/.config/scripts/wgStatus.sh"; exec-if = "which wg-quick"; on-click = "~/.config/scripts/wgStatus.sh toggle"; tooltip = true; interval = 3; return-type = "json"; escape = true; }; gamemode = { format = "{glyph}"; glyph = ""; hide-not-running = false; use-icon = true; icon-name = "input-gaming-symbolic"; icon-spacing = 4; icon-size = 20; tooltip = true; tooltip-format = "Games running: {count}"; on-click-right = "systemctl is-active --quiet gamemode.service && systemctl stop gamemode.service || systemctl start gamemode.service"; }; "custom/wallRand" = { format = ""; on-click = "${rofiWall}"; on-click-right = "${wallRand}"; }; "custom/airplay" = let toggleScript = pkgs.writeShellScript "airplayStatus" '' SERVICE="uxplay" ICON="󱖑" if [ "$1" = "toggle" ]; then if systemctl --user is-active --quiet "$SERVICE"; then systemctl --user stop "$SERVICE" notify-send "$ICON Airplay" "off" >/dev/null 2>&1 else systemctl --user start "$SERVICE" notify-send "$ICON Airplay" "on" >/dev/null 2>&1 fi exit 0 fi if ! systemctl --user is-active --quiet "$SERVICE"; then echo "{\"text\": \"inactive\", \"tooltip\": \"airplay is inactive\", \"alt\": \"inactive\", \"class\": \"inactive\"}" exit 0 fi echo "{\"text\": \"active\", \"tooltip\": \"airplay is running\", \"alt\": \"active\", \"class\": \"active\"}" exit 0 ''; in { format = "{icon}"; format-icons = { active = "󱖑"; inactive = ""; }; exec = toggleScript; interval = 3; tooltip = true; return-type = "json"; escape = true; on-click = "${toggleScript} toggle"; }; "custom/bitwarden" = { format = "󰯄"; on-click = "${rbwSelector}"; }; "custom/recording" = { exec = "[ -f \"/tmp/wf-recorder.pid\" ] && echo \"󰑋\" || echo \"\" "; interval = 1; on-click = "${toggleRecord}"; }; }; otherConfig = { modules-left = [ "custom/os" "hyprland/workspaces" "clock" "mpris" "custom/cava" ]; modules-right = [ "wlr/taskbar" (optionalString config.programs.gamemode.enable "gamemode") "temperature" "custom/recording" "idle_inhibitor" "network" "cpu" "memory" "pulseaudio" "battery" "custom/swaync" ]; }; finalList = if ((builtins.length settings) == 0) then [ otherConfig ] else settings; in map (dev: dev // modulesConfig // commonConfig) finalList; systemd = { enable = true; target = "graphical-session.target"; }; }; }