[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 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"] } # 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