feat(waybar): Added left side bar
This commit is contained in:
1 parent
7b0131f0c8
commit
4e1aebf265
1 file changed
+185
-1
@@ -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; [
|
home.packages = with pkgs; [
|
||||||
#Fonts
|
#Fonts
|
||||||
font-awesome
|
font-awesome
|
||||||
@@ -323,4 +476,35 @@
|
|||||||
in builtins.readFile cssFile;
|
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" ];
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user