feat(tray): system-tray status icon for the host (Windows + Linux)
New crates/punktfunk-tray — a small per-user companion showing the host service state at a glance (running / stopped / starting / degraded / failed + the live session in the tooltip) with one-click actions: open web console, approve a pending pairing request, start/stop/restart, open logs. No more digging through logs to learn whether the service came back after a reboot or an update. Status is service-manager-FIRST (SCM / systemd user unit — a port squatter can never fake Running), then the new loopback-only unauthenticated GET /api/v1/local/summary (counts/booleans only; the mgmt token and cert.pem are SYSTEM/Admins-DACL'd on Windows, so a non-elevated tray cannot bearer-auth). Windows: windows_subsystem binary (a console exe in the Run key would flash a terminal at sign-in), Shell_NotifyIcon + hidden window, per-session single instance, TaskbarCreated re-add, --quit for the uninstaller; service actions elevate per click via ShellExecuteW "runas" onto the new `punktfunk-host service restart` (stop → wait Stopped → start). Linux: ksni/StatusNotifierItem over zbus, systemctl --user actions (no polkit), /etc/xdg/autostart entry whose --autostart self-gates to actual host users. Icons: scripts/gen-tray-icons.py (pure stdlib) renders the brand lens + status dot into committed .ico/hicolor assets; deb/rpm/arch ship binary+autostart+icons. Live-validated: Linux on the headless KDE session (SNI registration, state transitions, menu-driven start, dbusmenu layout); Windows on the RTX box (session-1 launch with no NIM_ADD failure, single instance, --quit, restart round-trip, summary loopback-200/LAN-401). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
@@ -42,6 +42,8 @@ $here = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||
$iss = Join-Path $here 'punktfunk-host.iss'
|
||||
$exe = Join-Path $TargetDir 'punktfunk-host.exe'
|
||||
if (-not (Test-Path $exe)) { throw "missing build artifact 'punktfunk-host.exe' in $TargetDir (did 'cargo build --release -p punktfunk-host --features nvenc' run?)" }
|
||||
$trayExe = Join-Path $TargetDir 'punktfunk-tray.exe'
|
||||
if (-not (Test-Path $trayExe)) { throw "missing build artifact 'punktfunk-tray.exe' in $TargetDir (did 'cargo build --release -p punktfunk-tray' run?)" }
|
||||
New-Item -ItemType Directory -Force -Path $OutDir | Out-Null
|
||||
|
||||
# --- locate ISCC (Inno Setup) + signtool (Windows SDK) ---------------------------------------
|
||||
@@ -110,14 +112,15 @@ function Sign-File([string]$Path) {
|
||||
}
|
||||
}
|
||||
|
||||
# --- sign the inner exe before it's packed ----------------------------------------------------
|
||||
# --- sign the inner exes before they're packed -------------------------------------------------
|
||||
Sign-File $exe
|
||||
Sign-File $trayExe
|
||||
|
||||
# --- resolve + validate the installer's source files ------------------------------------------
|
||||
$repoRoot = (Resolve-Path (Join-Path $here '..\..')).Path
|
||||
$hostEnvSrc = Join-Path $repoRoot 'scripts\windows\host.env.example'
|
||||
$readmeSrc = Join-Path $here 'README.md'
|
||||
foreach ($p in @($exe, $hostEnvSrc, $readmeSrc, $iss)) {
|
||||
foreach ($p in @($exe, $trayExe, $hostEnvSrc, $readmeSrc, $iss)) {
|
||||
if (-not (Test-Path -LiteralPath $p)) { throw "installer source file missing: $p" }
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user