Adopts windows-reactor's own headless harness (the `test` feature + the upstream repo's `test_reactor`/RecordingBackend crate, same pinned rev) and pins the three semantics this client's state placement depends on, in tests/reactor_semantics.rs: * A child's sync `use_state` re-renders it through element-equal wrappers — the pre-bump reconciler pruned at the wrapper; fixed upstream (`nested_state_rerender.rs`). * A sync write from a backend-fired event handler re-renders — the "MenuFlyout handlers bypass the flush" claim does not hold at the engine level on this rev. * A child-owned `AsyncSetState` write still does NOT re-render its owner — newly diagnosed: every component RenderCx draws a fresh HostId but rerender callbacks are registered only for the root, so the child's request is a registry miss, silently dropped; the value surfaces on the next unrelated pass. The test asserts the broken behaviour on purpose, so the bump that fixes it upstream turns the test red and the discipline can be relaxed. (Upstream's own async test installs the guard for the very cx it tests and cannot see this; worth reporting with this repro.) The stale discipline note in app/mod.rs — written against the June rev — is replaced by the measured rules, each citing its test. Net: per-screen EVENT-driven UI state may live in the screen's own component; THREAD-driven state stays hoisted at root, now for a proven reason. Riding along (field report from the live review): the scope switcher no longer clips when the NavigationView collapses. WinUI's Auto mode shrinks the pane below 1008 epx and CLIPS pane-footer content to the rail; reactor exposes no pane-opened event, so root now reads the window size and the switcher follows the same threshold — expanded pane → pane footer, collapsed → a slim row leading the content column (an Auto/Star grid row, not a vstack, so the scroll viewport survives). Test builds use their own CARGO_TARGET_DIR by convention: windows-reactor-setup stages resources.pri next to the test binary and a RUNNING dev client holds that file mapped. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
115 lines
6.4 KiB
TOML
115 lines
6.4 KiB
TOML
[package]
|
|
name = "punktfunk-client-windows"
|
|
description = "Native Windows punktfunk/1 client — WinUI 3 (windows-reactor) shell, SDL3 gamepads; streaming runs in the spawned punktfunk-session binary"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
# Not workspace-inherited (1.82): windows-reactor at the pinned rev declares rust-version 1.95+
|
|
# and edition 2024. rust-toolchain.toml pins 1.96, so this records reality rather than raising it.
|
|
rust-version = "1.96"
|
|
license.workspace = true
|
|
authors.workspace = true
|
|
repository.workspace = true
|
|
|
|
[[bin]]
|
|
name = "punktfunk-client"
|
|
path = "src/main.rs"
|
|
|
|
# The couch/HTPC Start-menu entry. Its own executable because an MSIX <Application> cannot
|
|
# pass arguments to a full-trust exe — see the binary's own docs.
|
|
[[bin]]
|
|
name = "punktfunk-console"
|
|
path = "src/bin/punktfunk-console.rs"
|
|
|
|
# Everything is Windows-gated so `cargo build --workspace` stays green on Linux/macOS (the
|
|
# other native clients live in clients/linux and clients/apple); on other
|
|
# platforms this builds as a stub binary. Mirrors the Linux client's cfg(target_os="linux")
|
|
# gating exactly.
|
|
[target.'cfg(windows)'.dependencies]
|
|
# The protocol core, linked directly (no C ABI) — same as the GTK Linux client. NativeClient
|
|
# is Sync (mutexed plane receivers), so it drops into a UI app cleanly.
|
|
punktfunk-core = { path = "../../crates/punktfunk-core", features = ["quic"] }
|
|
# The shared client service layer: the trust/settings stores (ONE `Settings` struct for the
|
|
# shell and the spawned session binary — src/trust.rs re-exports it) and the game-library
|
|
# data model (fetch + art pipeline) behind the library page.
|
|
#
|
|
# `default-features = false` drops pf-client-core's default `pyrowave`, which would otherwise
|
|
# build the vendored PyroWave C++ INTO THE SHELL — dead weight here (the shell never decodes;
|
|
# it only offers "pyrowave" as a codec preference string the session binary acts on) and fatal
|
|
# on ARM64, where Granite's math falls back to x86 SSE intrinsics and stops at
|
|
# `simd.hpp: #error "Implement me."`. This does NOT drop PyroWave from the Windows client:
|
|
# decode lives in the spawned punktfunk-session binary, whose own default enables the feature,
|
|
# and cargo's feature unification turns it back on for the shared pf-client-core whenever that
|
|
# binary is in the same build (x64). On the ARM64 leg both are built --no-default-features, so
|
|
# nothing enables it and the C++ is never compiled.
|
|
pf-client-core = { path = "../../crates/pf-client-core", default-features = false }
|
|
|
|
# WinUI 3 UI via windows-reactor (a declarative React-like framework backed by WinUI).
|
|
# Unpublished (version 0.0.0) and fast-moving, so pinned to a verified commit. Pin bumped
|
|
# 2026-07-29 (from the 2026-07-01 rev) for: reconciler keyed-child-order fix (#4728), widget
|
|
# validation (#4727), DPI collision fix (#4751), icon elements (#4736), multi-window (#4730),
|
|
# scroll virtualization (#4710). All three windows-rs deps here MUST share this rev, and it
|
|
# must match pf-client-core's `windows` pin, so the workspace builds ONE windows-rs.
|
|
windows-reactor = { git = "https://github.com/microsoft/windows-rs", rev = "acb5a1a7441033d9312b16842af02eb0c2b403dc" }
|
|
# Win32 / DXGI for the GPU picker and the shell's window plumbing. Pulled from the SAME
|
|
# windows-rs commit as windows-reactor so their `windows-core` unifies — the `IDXGISwapChain1`
|
|
# we hand to `SwapChainPanelHandle::set_swap_chain` must satisfy reactor's `windows_core::Interface`.
|
|
# Features are header-named since the in-house-metadata rework (#4689) — one feature per SDK
|
|
# header, replacing the old `Win32_*` namespace features.
|
|
windows = { git = "https://github.com/microsoft/windows-rs", rev = "acb5a1a7441033d9312b16842af02eb0c2b403dc", features = [
|
|
# GetCurrentPackageFullName — the packaged-run probe guarding the explicit
|
|
# AppUserModelID (main.rs; MSIX identity must win over the dev-run tag).
|
|
"appmodel",
|
|
# CoCreateInstance/CoInitializeEx (+ objbase/objidl/wtypesbase below) for the
|
|
# "Create shortcut" writer (deeplink.rs).
|
|
"combaseapi",
|
|
# SetWindowSubclass/DefSubclassProc — the deep-link WM_COPYDATA subclass hook.
|
|
"commctrl",
|
|
"consoleapi",
|
|
"dxgi",
|
|
"errhandlingapi",
|
|
"libloaderapi",
|
|
"objbase",
|
|
"objidl",
|
|
# SetCurrentProcessExplicitAppUserModelID + ShellLink/IShellLinkW.
|
|
"shobjidl_core",
|
|
"synchapi",
|
|
"winerror",
|
|
# Windowing, messages, icons — and COPYDATASTRUCT, which lives in winuser now too.
|
|
"winuser",
|
|
] }
|
|
|
|
# FFmpeg — used only to enumerate which codecs this client can decode (probe::decodable_codecs),
|
|
# advertised to the host on the speed-test connect. Same pin as the host/Linux client. (Real
|
|
# decode + present live in the spawned punktfunk-session binary.)
|
|
ffmpeg-next = "8"
|
|
|
|
# Gamepad enumeration + pin persistence for Settings runs on pf-client-core's shared SDL service
|
|
# (see the `gamepad` field in app/); the spawned punktfunk-session does the actual forwarding. SDL3
|
|
# itself (built from source via the bundled CMake on Windows) is pulled transitively by
|
|
# pf-client-core with the same `build-from-source,hidapi` features, so it is not a direct dep here.
|
|
mdns-sd = "0.20"
|
|
async-channel = "2"
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
tracing = "0.1"
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|
|
|
# The reactor's own headless test harness, at the SAME pinned rev: the `test` feature gates
|
|
# `RenderCx::for_test`/`ChannelDispatcher`; `test_reactor` is the upstream repo's
|
|
# RecordingBackend crate (cargo resolves a git dep's workspace member by package name).
|
|
# These power tests/reactor_semantics.rs — the characterization suite for the re-render
|
|
# semantics this client's architecture depends on. Re-run it on every future SHA bump.
|
|
[target.'cfg(windows)'.dev-dependencies]
|
|
windows-reactor = { git = "https://github.com/microsoft/windows-rs", rev = "acb5a1a7441033d9312b16842af02eb0c2b403dc", features = ["test"] }
|
|
test_reactor = { git = "https://github.com/microsoft/windows-rs", rev = "acb5a1a7441033d9312b16842af02eb0c2b403dc" }
|
|
|
|
# Embeds the app icon as an exe resource (build.rs) — Windows hosts only (rc.exe from the SDK).
|
|
# windows-reactor-setup stages the Windows App SDK runtime bootstrap (framework-dependent) next
|
|
# to the exe — the new-model replacement for the old windows-reactor build.rs; same pinned rev.
|
|
[target.'cfg(windows)'.build-dependencies]
|
|
winresource = "0.1"
|
|
windows-reactor-setup = { git = "https://github.com/microsoft/windows-rs", rev = "acb5a1a7441033d9312b16842af02eb0c2b403dc" }
|
|
|
|
[lints]
|
|
workspace = true
|