diff --git a/root/home/bhasher/.config/waybar/config b/root/home/bhasher/.config/waybar/config
index 5bdc686..345acbc 100644
--- a/root/home/bhasher/.config/waybar/config
+++ b/root/home/bhasher/.config/waybar/config
@@ -4,9 +4,9 @@
"height": 24, // Waybar height
// "width": 1366, // Waybar width
// Choose the order of the modules
- "modules-left": ["hyprland/workspaces", "hyprland/mode", "custom/spotify"],
+ "modules-left": ["hyprland/workspaces"],
"modules-center": ["hyprland/window"],
- "modules-right": ["pulseaudio", "network", "cpu", "memory", "battery", "tray", "clock"],
+ "modules-right": ["pulseaudio", "network", "custom/bandwidth", "cpu", "memory", "battery", "tray", "clock"],
"hyprland/workspaces": {
"disable-scroll": true,
"all-outputs": false,
@@ -23,9 +23,6 @@
"default": ""
}
},
- "hyprland/mode": {
- "format": "{}"
- },
"tray": {
// "icon-size": 21,
"spacing": 10
@@ -52,10 +49,13 @@
},
"network": {
// "interface": "wlp2s0", // (Optional) To force the use of this interface
- "format-wifi": "{essid} ({signalStrength}%) ",
+ "format-wifi": "{essid} ({signalStrength}) ",
"format-ethernet": "{ifname}: {ipaddr}/{cidr} ",
"format-disconnected": "Disconnected ⚠"
},
+ "custom/bandwidth": {
+ "exec": "$HOME/.config/waybar/scripts/bandwidth"
+ },
"pulseaudio": {
//"scroll-step": 1,
"format": "{volume}% {icon}",
diff --git a/root/home/bhasher/.config/waybar/scripts/bandwidth b/root/home/bhasher/.config/waybar/scripts/bandwidth
new file mode 100755
index 0000000..97e4e7e
--- /dev/null
+++ b/root/home/bhasher/.config/waybar/scripts/bandwidth
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+import subprocess
+from time import sleep
+
+
+def default_interface():
+ process = subprocess.run(
+ ["ip", "route"], check=True, text=True, capture_output=True
+ )
+ for line in process.stdout.splitlines():
+ if line.startswith("default via"):
+ return line.split()[4]
+ raise RuntimeError("No default interface found")
+
+
+def get_rx_tx_bytes(iface):
+ with open("/proc/net/dev") as f:
+ for line in f:
+ line = line.strip()
+ if not line.startswith(f"{iface}:"):
+ continue
+ rx_bytes = int(line.split()[1])
+ tx_bytes = int(line.split()[9])
+ return rx_bytes, tx_bytes
+ raise RuntimeError(f"Interface {iface} not found")
+
+
+def format_size(size):
+ power_labels = {0: "B", 1: "K", 2: "M", 3: "G", 4: "T"}
+ #kilo = 2**10
+ #power = 0
+ #while size > kilo:
+ # size /= kilo
+ # power += 1
+ power = 1
+ return f"{size/1024:3.0f} {power_labels[power]}"
+
+
+def main():
+ refresh_interval = 1
+ rx_icon = " "
+ tx_icon = " "
+ num_left = ""
+ num_right = ""
+ fmt_str = (
+ f"{rx_icon}{num_left}{{rx}}{{unit_suffix}}{num_right} "
+ f"{tx_icon}{num_left}{{tx}}{{unit_suffix}}{num_right}"
+ )
+ unit_suffix = ""
+ iface = default_interface()
+
+ rx_bytes, tx_bytes = get_rx_tx_bytes(iface)
+
+ while True:
+ prev_rx_bytes, prev_tx_bytes = rx_bytes, tx_bytes
+ rx_bytes, tx_bytes = get_rx_tx_bytes(iface)
+ drx = format_size((rx_bytes - prev_rx_bytes) / refresh_interval)
+ dtx = format_size((tx_bytes - prev_tx_bytes) / refresh_interval)
+ line = fmt_str.format(rx=drx, tx=dtx, unit_suffix=unit_suffix)
+ print(line, flush=True)
+ sleep(refresh_interval)
+
+
+if __name__ == "__main__":
+ main()