feat(quickshell): add dense telemetry bar #4
@@ -552,5 +552,113 @@
|
|||||||
machine.crash()
|
machine.crash()
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# `nix develop` — hot-reload loop for dotfiles/quickshell.
|
||||||
|
#
|
||||||
|
# hosts/terra/home.nix ships the shell via `xdg.configFile."quickshell"`,
|
||||||
|
# which COPIES the tree into the store, so ~/.config/quickshell is a
|
||||||
|
# read-only symlink into /nix/store and every QML tweak costs a
|
||||||
|
# nixos-rebuild. quickshell DOES hot-reload on file save — but only for
|
||||||
|
# the files it is watching, which are those frozen store copies. Pointing
|
||||||
|
# it at the working tree with `qs -p` restores edit-save-see, no rebuild.
|
||||||
|
#
|
||||||
|
# quickshell keys instance identity on the CONFIG PATH, so a working-tree
|
||||||
|
# instance and the store-backed one are two different instances that would
|
||||||
|
# both map layer-shell bars onto every output. Hence a swap, not a second
|
||||||
|
# instance — and the swap starts dev FIRST, killing the packaged shell
|
||||||
|
# only once dev is confirmed up, so a QML error in the working tree leaves
|
||||||
|
# you on your normal bar instead of no bar at all.
|
||||||
|
#
|
||||||
|
# Every kill is scoped to one config (`qs kill` = default only, `qs kill
|
||||||
|
# -p` = that path only). A blanket kill would also take out unrelated
|
||||||
|
# quickshell instances — pkgs/rishot.nix is one.
|
||||||
|
#
|
||||||
|
# Deliberately NOT wired to direnv (no .envrc in this repo): programs.direnv
|
||||||
|
# is enabled for this user, so a `use flake` would swap the running desktop
|
||||||
|
# shell on every `cd` into the checkout, including over ssh.
|
||||||
|
devShells.${system}.default =
|
||||||
|
let
|
||||||
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
# Same nixpkgs terra's home.nix takes pkgs.quickshell from, so the dev
|
||||||
|
# instance is the identical build to the packaged one.
|
||||||
|
qs = "${nixpkgs.legacyPackages.${system}.quickshell}/bin/qs";
|
||||||
|
git = "${nixpkgs.legacyPackages.${system}.git}/bin/git";
|
||||||
|
|
||||||
|
# Resolved at RUN time, not build time: the entire point is to run the
|
||||||
|
# working tree, and `self` here is only a store snapshot of it.
|
||||||
|
preamble = ''
|
||||||
|
root="$(${git} rev-parse --show-toplevel 2>/dev/null || pwd)"
|
||||||
|
cfg="$root/dotfiles/quickshell"
|
||||||
|
if [ ! -f "$cfg/shell.qml" ]; then
|
||||||
|
echo "no shell.qml under $cfg — run this from the homelab checkout" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# `qs list` exits 0 whether or not it found anything, and only emits
|
||||||
|
# json when it did — so "json came back" is the liveness test.
|
||||||
|
running() { ${qs} list -p "$1" -j 2>/dev/null | grep -q '"id"'; }
|
||||||
|
prod_running() { ${qs} list -j 2>/dev/null | grep -q '"id"'; }
|
||||||
|
'';
|
||||||
|
|
||||||
|
qs-dev = pkgs.writeShellScriptBin "qs-dev" ''
|
||||||
|
set -uo pipefail
|
||||||
|
${preamble}
|
||||||
|
|
||||||
|
if [ -z "''${WAYLAND_DISPLAY:-}" ]; then
|
||||||
|
echo "qs-dev: no WAYLAND_DISPLAY — refusing to swap the desktop shell" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if running "$cfg"; then
|
||||||
|
echo "qs-dev: already running from $cfg"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
${qs} -d -p "$cfg"
|
||||||
|
|
||||||
|
# Confirm it came up before touching the packaged shell.
|
||||||
|
for _ in $(seq 1 50); do
|
||||||
|
running "$cfg" && break
|
||||||
|
sleep 0.1
|
||||||
|
done
|
||||||
|
|
||||||
|
if ! running "$cfg"; then
|
||||||
|
echo "qs-dev: dev shell failed to start — packaged shell left alone" >&2
|
||||||
|
echo "qs-dev: run 'qs -p $cfg' in the foreground to see the QML error" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
${qs} kill || true
|
||||||
|
echo "qs-dev: live on $cfg — edits there now hot-reload"
|
||||||
|
'';
|
||||||
|
|
||||||
|
qs-prod = pkgs.writeShellScriptBin "qs-prod" ''
|
||||||
|
set -uo pipefail
|
||||||
|
${preamble}
|
||||||
|
|
||||||
|
running "$cfg" && ${qs} kill -p "$cfg" || true
|
||||||
|
prod_running || ${qs} -d
|
||||||
|
echo "qs-prod: back on ~/.config/quickshell"
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
pkgs.mkShell {
|
||||||
|
packages = [ pkgs.quickshell qs-dev qs-prod ];
|
||||||
|
|
||||||
|
# Swap on entry, swap back on exit. Three guards:
|
||||||
|
# - interactive only ($- has i). `nix develop --command X` EXECs X,
|
||||||
|
# replacing the shell that set the trap, so the restore would
|
||||||
|
# never run and you'd be left on the dev instance. Non-interactive
|
||||||
|
# use gets the explicit `nix develop -c qs-dev` instead.
|
||||||
|
# - WAYLAND_DISPLAY, so entering the shell over ssh cannot kill the
|
||||||
|
# desktop's bar and leave nothing in its place.
|
||||||
|
# - a sentinel, so a nested `nix develop` does not swap (and then
|
||||||
|
# restore) a second time.
|
||||||
|
shellHook = ''
|
||||||
|
if [[ $- == *i* ]] && [ -n "''${WAYLAND_DISPLAY:-}" ] && [ -z "''${HOMELAB_QS_DEV:-}" ]; then
|
||||||
|
export HOMELAB_QS_DEV=1
|
||||||
|
qs-dev && trap qs-prod EXIT
|
||||||
|
fi
|
||||||
|
echo "homelab devshell — qs-dev (working tree) / qs-prod (packaged); exit restores"
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user