Files
enricobuehler dfde5080cc chore(deps): windows-service 0.7 -> 0.8 (host + tray), removing the last windows-sys 0.52 in the tree
Version currency for the SCM plumbing behind `punktfunk-host service` (the
dispatcher, control handler and ServiceManager install) and the tray's
unprivileged QUERY_STATUS probe. No code changed in either crate.

The payoff is dependency unification, not the API. `windows-service 0.7` was the
ONLY crate in the workspace still pulling `windows-sys 0.52`, so it alone kept a
fourth windows-sys major compiling. It resolves to 0.8.1, which moves to
`windows-sys 0.61` — a version the tree already builds — and the duplicate
disappears:

  cargo tree -d --target x86_64-pc-windows-msvc | grep '^windows-sys v'
    before: 0.45.0, 0.52.0, 0.59.0, 0.61.2
    after:  0.45.0,         0.59.0, 0.61.2

Note 0.8.0 would NOT have been enough — it lands on windows-sys 0.59. 0.8.1 is
the release that reaches 0.61, hence the `"0.8"` caret plus the comment pinning
the reasoning to the manifest.

The 0.7 -> 0.8 delta is tiny and touches nothing this tree calls: `ServiceAccess`
gains READ_CONTROL / WRITE_DAC / WRITE_OWNER (additive), and `Service::raw_handle`
changes return type from `Security::SC_HANDLE` to `Services::SC_HANDLE` as a
consequence of the windows-sys bump — we never call it. `ScHandle` is crate-private
upstream. No enum gained variants, and the service control handler's match already
ends in a `_ =>` arm, so the `#[non_exhaustive]` types stay safe.

What remains duplicated (deliberately out of scope here): windows-sys 0.45 via
`jni`, and 0.59 via `punktfunk-core` + `if-addrs`.
2026-08-13 13:35:30 +02:00

70 lines
3.3 KiB
TOML

[package]
name = "punktfunk-tray"
description = "System-tray status icon for the punktfunk streaming host (Windows notification area / Linux StatusNotifierItem)"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
authors.workspace = true
repository.workspace = true
[[bin]]
name = "punktfunk-tray"
path = "src/main.rs"
# Deliberately does NOT depend on punktfunk-host: the tray needs only the service name, the mgmt
# port, and the summary JSON shape — a dependency would drag the whole host (FFmpeg, PipeWire, …)
# into a 2 MB helper and make it un-buildable standalone. Non-Windows/non-Linux targets build a
# stub main (same pattern as the platform-gated clients).
[dependencies]
anyhow = "1"
[target.'cfg(any(windows, target_os = "linux"))'.dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"
# Loopback HTTPS poll of GET /api/v1/local/summary. Same sync ureq + rustls stack and
# custom-verifier pattern as the Linux client's library fetch (crates/pf-client-core/src/library.rs),
# on the same aws-lc-rs backend as the rest of the tree (the agent pins the provider explicitly).
# ⚠ `rustls-no-provider`, NEVER the default `rustls` feature — that one pulls `_ring`.
ureq = { version = "3", default-features = false, features = [
"rustls-no-provider",
"rustls-webpki-roots",
] }
rustls = { version = "0.23", default-features = false, features = ["aws_lc_rs", "prefer-post-quantum", "logging", "std", "tls12"] }
# The one shared cert-fingerprint pin verifier (`punktfunk_core::tls::PinVerify`) + fingerprint
# hash, instead of the tray hand-rolling its own copy on a trust boundary. The light `tls` feature
# is rustls + sha2 only (no QUIC runtime / tokio), so this stays a lean helper — much smaller than
# the host dependency ruled out above, though rustls's aws-lc-rs backend does mean a C compiler.
punktfunk-core = { path = "../punktfunk-core", default-features = false, features = ["tls", "ureq-tls"] }
[target.'cfg(windows)'.dependencies]
# SCM QUERY_STATUS works unprivileged — the service-state probe. Same crate the host service uses,
# and it must stay in lockstep with it — see the windows-sys note on the host's declaration.
windows-service = "0.8"
windows = { version = "0.62", features = [
"Win32_Foundation",
"Win32_Graphics_Gdi",
"Win32_Security", # CreateMutexW's SECURITY_ATTRIBUTES parameter type
"Win32_System_LibraryLoader",
"Win32_System_Registry", # AppsUseLightTheme — glyph color must match the themed menu
"Win32_System_Threading",
"Win32_UI_HiDpi",
"Win32_UI_Shell",
"Win32_UI_WindowsAndMessaging",
] }
[target.'cfg(target_os = "linux")'.dependencies]
# StatusNotifierItem (pure Rust, zbus — the same zbus the host already pulls via ashpd). The tray
# is a plain-threads poller, so the blocking API over the small async-io executor (`blocking`
# alone is just the wrapper — zbus still needs an executor; no tokio runtime in a tray icon).
ksni = { version = "0.3", default-features = false, features = ["async-io", "blocking"] }
libc = "0.2"
# Build-time icon embedding (exe icon + the status-variant tray icons), host-gated like the
# Windows client's build.rs — cross-builds from Linux CI runners skip it.
[target.'cfg(windows)'.build-dependencies]
winresource = "0.1"
[lints]
workspace = true