From 4e1aebf265eca88dd6884733e611f8453c00afc7 Mon Sep 17 00:00:00 2001 From: Kirill Date: Fri, 7 Aug 2026 16:27:13 +0300 Subject: [PATCH] feat(waybar): Added left side bar --- user/kirill/modules/waybar.nix | 186 ++++++++++++++++++++++++++++++++- 1 file changed, 185 insertions(+), 1 deletion(-) diff --git a/user/kirill/modules/waybar.nix b/user/kirill/modules/waybar.nix index fe94d28..bc8ebc4 100644 --- a/user/kirill/modules/waybar.nix +++ b/user/kirill/modules/waybar.nix @@ -1,4 +1,157 @@ -{ osConfig, config, pkgs, lib, ... }: { +{ osConfig, config, pkgs, lib, ... }: let + c = config.lib.stylix.colors.withHashtag; + + # ---- Left edge power bar (separate waybar instance) ---- + leftWidth = 50; + + networkSpeed = pkgs.writeShellApplication { + name = "network-speed"; + runtimeInputs = [ pkgs.coreutils pkgs.gawk pkgs.iproute2 ]; + text = '' + set -euo pipefail + state=/tmp/waybar-network-speed + + iface=$(ip route show default | awk '{print $5; exit}') + if [ -z "$iface" ]; then + iface=$(awk 'NR > 2 && $1 != "lo:" { sub(":", "", $1); print $1; exit }' /proc/net/dev) + fi + [ -z "$iface" ] && exit 0 + + read -r rx tx < <(awk -v i="$iface" '$1 ~ i":" { print $2, $10 }' /proc/net/dev) + if [ -f "$state" ]; then + read -r prx ptx ts < "$state" + now=$(date +%s) + dt=$((now - ts)); [ "$dt" -lt 1 ] && dt=1 + down=$(((rx - prx) / dt)); [ "$down" -lt 0 ] && down=0 + up=$(((tx - ptx) / dt)); [ "$up" -lt 0 ] && up=0 + echo " $(numfmt --to=iec --suffix=B/s "$down") $(numfmt --to=iec --suffix=B/s "$up")" + fi + printf '%s %s %s\n' "$rx" "$tx" "$(date +%s)" > "$state" + ''; + }; + + leftbarJson = { + collapsed = pkgs.writeText "leftbar-collapsed.json" (builtins.toJSON { + layer = "top"; + exclusive = false; + position = "left"; + width = 1; + spacing = 0; + modules-left = [ "custom/hidden" ]; + modules-center = [ ]; + modules-right = [ ]; + "custom/hidden" = { + format = ""; + }; + }); + + expanded = pkgs.writeText "leftbar-expanded.json" (builtins.toJSON { + layer = "top"; + exclusive = false; + position = "left"; + width = leftWidth; + spacing = 0; + modules-left = [ "custom/network-speed" "disk" ]; + modules-center = [ ]; + modules-right = [ "custom/restart" "custom/power" ]; + "custom/power" = { + format = ""; + on-click = "systemctl poweroff"; + tooltip = false; + }; + "custom/restart" = { + format = ""; + on-click = "systemctl reboot"; + tooltip = false; + }; + "custom/network-speed" = { + exec = "${lib.getExe networkSpeed}"; + interval = 2; + rotate = 90; + tooltip = false; + }; + disk = { + interval = 30; + rotate = 90; + format = "{percentage_free}%"; + paths = [ "/" ]; + }; + }); + }; + + leftbarCss = { + collapsed = pkgs.writeText "leftbar-collapsed.css" '' + window#waybar { + background: ${c.base0B}; + min-width: 1px; + } + ''; + + expanded = pkgs.writeText "leftbar-expanded.css" '' + window#waybar { + background: transparent; + min-width: ${toString leftWidth}px; + font-family: "Symbols Nerd Font Mono", "Monocraft", "Font Awesome 7 Free"; + font-weight: bold; + font-size: 1.3em; + } + + #custom-power, + #custom-restart, + #custom-network-speed, + #disk { + background: ${c.base00}; + color: ${c.base05}; + border-radius: 6px; + min-height: 34px; + margin: 4px; + } + + #custom-power:hover, + #custom-restart:hover, + #custom-network-speed:hover, + #disk:hover { + background: ${c.base0B}; + color: ${c.base00}; + } + ''; + }; + + leftbarHover = pkgs.writeShellApplication { + name = "leftbar-hover"; + runtimeInputs = [ pkgs.coreutils pkgs.systemd ]; + text = '' + set -euo pipefail + hyprctl="${(config.wayland.windowManager.hyprland.package or pkgs.hyprland)}/bin/hyprctl" + rt="''${XDG_RUNTIME_DIR:-/run/user/$(id -u)}" + json="$rt/leftbar.json" + css="$rt/leftbar.css" + state=collapsed + + cp -f "${leftbarJson.collapsed}" "$json" + cp -f "${leftbarCss.collapsed}" "$css" + + while true; do + pos="$($hyprctl cursorpos 2>/dev/null)" || pos="" + x="''${pos%%,*}" + if [ -n "$x" ]; then + if [ "$state" != expanded ] && [ "$x" -ge 0 ] && [ "$x" -le 1 ]; then + state=expanded + cp -f "${leftbarJson.expanded}" "$json" + cp -f "${leftbarCss.expanded}" "$css" + systemctl --user restart waybar-left || true + elif [ "$state" != collapsed ] && [ "$x" -gt ${toString leftWidth} ]; then + state=collapsed + cp -f "${leftbarJson.collapsed}" "$json" + cp -f "${leftbarCss.collapsed}" "$css" + systemctl --user restart waybar-left || true + fi + fi + sleep 0.05 + done + ''; + }; +in { home.packages = with pkgs; [ #Fonts font-awesome @@ -323,4 +476,35 @@ in builtins.readFile cssFile; }; + # Left edge bar: own waybar instance with its own config/style, + # toggled between 1px accent strip and 8px button bar by the hover daemon. + xdg.configFile."waybar/leftbar-collapsed.json".source = leftbarJson.collapsed; + xdg.configFile."waybar/leftbar-expanded.json".source = leftbarJson.expanded; + xdg.configFile."waybar/leftbar-collapsed.css".source = leftbarCss.collapsed; + xdg.configFile."waybar/leftbar-expanded.css".source = leftbarCss.expanded; + + systemd.user.services.waybar-left = { + Unit = { + Description = "Waybar left edge bar"; + After = [ "waybar-left-hover.service" ]; + Wants = [ "waybar-left-hover.service" ]; + }; + Service = { + ExecStart = "${lib.getExe pkgs.waybar} -c %t/leftbar.json -s %t/leftbar.css"; + Restart = "on-failure"; + RestartSec = 2; + }; + Install.WantedBy = [ "default.target" ]; + }; + + systemd.user.services.waybar-left-hover = { + Unit.Description = "Waybar left edge bar hover daemon"; + Service = { + ExecStart = "${lib.getExe leftbarHover}"; + Restart = "on-failure"; + RestartSec = 2; + }; + Install.WantedBy = [ "default.target" ]; + }; + }