Clicking the Network pill now toggles a drawer listing processes ranked by network throughput, refreshed live only while open — mirroring the CPU widget's top-processes drawer. services/topnet.sh (single-shot, like topproc.sh) takes two `ss` snapshots procInterval apart, diffs each TCP socket's cumulative rx/tx bytes by inode, sums positive deltas per owning PID, and prints ranked "N <rx/s> <tx/s> <name>" frames. SysStats re-runs it while netProcPollEnabled (drawer open) using the same SplitParser-accumulate / parse-on-exit / re-arm plumbing as procScan. Network.qml wraps its Pill in an Item and hangs a fixed-size PopupWindow drawer off it. ss (iproute2) is added to runtimeInputs since per-process byte accounting has no virtual-file equivalent. Caveat: ss only exposes byte counters for TCP sockets, so UDP/QUIC traffic is not attributed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
89 lines
2.8 KiB
Nix
89 lines
2.8 KiB
Nix
{
|
|
description = "A Wayland status bar for Sway, built with Quickshell";
|
|
|
|
inputs = {
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
# Upstream Quickshell, tracked directly so we get layer-surface fixes
|
|
# (e.g. clean buffers on output transform / rotation) ahead of nixpkgs.
|
|
quickshell = {
|
|
url = "git+https://git.outfoxxed.me/quickshell/quickshell";
|
|
inputs.nixpkgs.follows = "nixpkgs";
|
|
};
|
|
};
|
|
|
|
outputs = { self, nixpkgs, quickshell }:
|
|
let
|
|
systems = [ "x86_64-linux" "aarch64-linux" ];
|
|
forAllSystems = f:
|
|
nixpkgs.lib.genAttrs systems (system: f nixpkgs.legacyPackages.${system});
|
|
in
|
|
{
|
|
packages = forAllSystems (pkgs:
|
|
let
|
|
# Quickshell from the upstream flake rather than nixpkgs.
|
|
qsPkg = quickshell.packages.${pkgs.system}.default;
|
|
|
|
# Runtime tools the bar relies on: discover.sh (one-shot hardware
|
|
# probe), the periodic `df` for disk usage, and `ss` (iproute2) for
|
|
# the per-process network drawer (topnet.sh). Everything else is read
|
|
# from /proc and /sys directly in QML.
|
|
runtimeInputs = [
|
|
qsPkg
|
|
pkgs.bash
|
|
pkgs.coreutils # df, cat
|
|
pkgs.iproute2 # ss, for topnet.sh per-process network usage
|
|
];
|
|
|
|
# Self-contained font set so Nerd Font glyphs always render,
|
|
# regardless of the host's installed fonts.
|
|
fontsConf = pkgs.makeFontsConf {
|
|
fontDirectories = [
|
|
pkgs.nerd-fonts.jetbrains-mono
|
|
pkgs.nerd-fonts.symbols-only
|
|
pkgs.inter
|
|
];
|
|
};
|
|
|
|
bar = pkgs.writeShellApplication {
|
|
name = "quickshell-bar";
|
|
inherit runtimeInputs;
|
|
text = ''
|
|
export FONTCONFIG_FILE=${fontsConf}
|
|
exec quickshell --path ${self} "$@"
|
|
'';
|
|
};
|
|
in
|
|
{
|
|
default = bar;
|
|
quickshell-bar = bar;
|
|
});
|
|
|
|
apps = forAllSystems (pkgs: {
|
|
default = {
|
|
type = "app";
|
|
program = "${self.packages.${pkgs.system}.default}/bin/quickshell-bar";
|
|
};
|
|
});
|
|
|
|
devShells = forAllSystems (pkgs: {
|
|
default = pkgs.mkShell {
|
|
packages = [
|
|
quickshell.packages.${pkgs.system}.default
|
|
pkgs.bash
|
|
pkgs.coreutils
|
|
pkgs.iproute2 # ss, for topnet.sh
|
|
pkgs.nerd-fonts.jetbrains-mono
|
|
pkgs.inter
|
|
pkgs.qt6.qtdeclarative # qmlls / qmlformat for editing
|
|
];
|
|
shellHook = ''
|
|
echo "quickshell $(quickshell --version 2>/dev/null | head -1)"
|
|
echo "Run the bar with: quickshell --path ."
|
|
'';
|
|
};
|
|
});
|
|
|
|
formatter = forAllSystems (pkgs: pkgs.nixpkgs-fmt);
|
|
};
|
|
}
|