Files
quickshell_bar/flake.nix
Asmir A dfb16cce4e Add per-process network drawer to the Network widget
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>
2026-06-02 18:40:26 +02:00

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);
};
}