Open YodaEmbedding opened 1 year ago
I ended up writing my own custom module:
#!/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:
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("Interface 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
return f"{size:3.0f} {power_labels[power]}"
def main():
refresh_interval = 2
rx_icon = " "
tx_icon = " "
num_left = "<span font='NotoSansMono'>"
num_right = "</span>"
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()
config:
"custom/bandwidth": {
"exec": "$HOME/.config/waybar/scripts/bandwidth"
},
Agree. The network module should provide a constant width solution, to prevent a group of labels from getting shifted. Adjusting the CSS can do, but far from elegant.
Agreed. Module is currently unusable on vertical bars due to this. I know I can rotate, but that's just as bad making everything else jump around.
Would also love to see a way to fix it to MB/s etc
Constant width is already possible by using specifications like <
, >
, =
.
e.g. for bandwidthDownBytes
:
{bandwidthDownBytes:<}
aligns the speed and the unit to the left{bandwidthDownBytes:>}
aligns the speed and the unit to the right{bandwidthDownBytes:=}
aligns the speed to the left and the unit to the rightI ended up writing my own custom module:
#!/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: 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("Interface 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 return f"{size:3.0f} {power_labels[power]}" def main(): refresh_interval = 2 rx_icon = " " tx_icon = " " num_left = "<span font='NotoSansMono'>" num_right = "</span>" 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()
config:
"custom/bandwidth": { "exec": "$HOME/.config/waybar/scripts/bandwidth" },
Does this solve the variable width issue? @YodaEmbedding ?
For the network module, it would be nice to format the bandwidth speeds in a more compact, and also non width-varying manner.
This shaves off a few unimportant characters for valuable waybar real estate, and prevents the module from varying in width (when wrapped in a monospace font, e.g.
<span font='NotoSansMono-Regular'>{bandwidthDownBytes}</span>
).