feat(windows-client): SDL3 gamepads + docs — full stage-1 parity, MSVC-green
apple / swift (push) Successful in 54s
audit / cargo-audit (push) Failing after 1m19s
android / android (push) Failing after 2m22s
ci / web (push) Successful in 41s
ci / docs-site (push) Successful in 33s
ci / bench (push) Successful in 1m56s
deb / build-publish (push) Successful in 3m28s
ci / rust (push) Successful in 7m23s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 6s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 4s
decky / build-publish (push) Successful in 12s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 4s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 4s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 18s
flatpak / build-publish (push) Successful in 3m59s
rpm / build-publish (bazzite, punktfunk-fedora-rpm) (push) Successful in 5m21s
docker / deploy-docs (push) Successful in 7s
rpm / build-publish (fedora-44, punktfunk-fedora44-rpm) (push) Successful in 4m43s

Adds the SDL3 gamepad service (near-verbatim port of the GTK client's — SDL3 is
cross-platform) and wires it into the winit app: per-session capture (buttons/axes,
DualSense touchpad + motion 0xCC), feedback (rumble, lightbar, raw DualSense effects),
single-pad-forwarded model with auto pad-type from the physical controller. Built from
source on Windows (no system SDL3).

- gamepad.rs: GamepadService (app-lifetime SDL thread) attach/detach on session
  connect/end; auto_pref resolves "Automatic" to the attached pad's type.
- app.rs: hold the service, attach on Connected, detach on Ended/Failed/close. Also
  simplify the keydown path (drop the identical if/else arms).
- main.rs: start the service for the windowed path, resolve GamepadPref from settings +
  the physical pad.

Build gotcha documented + fixed in the dev loop: SDL3's build-from-source MSVC
precompiled-header chokes on the `ü` in the dev box's username embedded in the cargo
registry path (MSB8084/C4828) — CARGO_HOME must be an ASCII path
(C:\Users\Public\.cargo). Unrelated to our code.

Docs: CLAUDE.md M4 + docs/windows-client-bootstrap.md status banner (winit-not-Reactor
rationale, CARGO_HOME gotcha, what's pending) + docs-site clients.md "Windows desktop
client (in development)". Crate is build + clippy + fmt + test green on
x86_64-pc-windows-msvc.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 22:11:35 +00:00
parent e4bdec97bd
commit 296b976b8f
8 changed files with 711 additions and 18 deletions
Generated
+80
View File
@@ -3123,6 +3123,7 @@ dependencies = [
"opus",
"punktfunk-core",
"raw-window-handle",
"sdl3",
"serde",
"serde_json",
"tracing",
@@ -3521,6 +3522,12 @@ dependencies = [
"windows-sys 0.52.0",
]
[[package]]
name = "rpkg-config"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a2d2f3481209a6b42eec2fbb49063fb4e8d35b57023401495d4fe0f85c817f0"
[[package]]
name = "rsa"
version = "0.9.10"
@@ -3770,16 +3777,89 @@ checksum = "25bd22eb1bbc9137e914022b4994ed35591eea0884e9e3e98e6d9895cad6e1d2"
dependencies = [
"bitflags 2.13.0",
"libc",
"sdl3-image-sys",
"sdl3-mixer-sys",
"sdl3-sys",
"sdl3-ttf-sys",
]
[[package]]
name = "sdl3-image-src"
version = "3.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe273101c7dab94551183212eee9adef1a7bf274d407f0b7bfe72482960ab25c"
[[package]]
name = "sdl3-image-sys"
version = "0.6.4+SDL-image-3.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a445f781b39a1c1bc751f5f4612191e0402006e35ad5d02d9193281afad1cf4"
dependencies = [
"cmake",
"pkg-config",
"rpkg-config",
"sdl3-image-src",
"sdl3-sys",
"vcpkg",
]
[[package]]
name = "sdl3-mixer-src"
version = "3.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9cd815ae87084588c7dbd027c1667b0a5e21a6b5ae7b22ecb230bc21c7063eca"
[[package]]
name = "sdl3-mixer-sys"
version = "0.6.3+SDL-mixer-3.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b5a157588924cf886bdc3a7c9d0e478cdad35d315740f26af00609a61e7c327"
dependencies = [
"cmake",
"pkg-config",
"rpkg-config",
"sdl3-mixer-src",
"sdl3-sys",
"vcpkg",
]
[[package]]
name = "sdl3-src"
version = "3.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed4dcad85f1657d3424642ca2ed8f9f185212975baefda8972ac606494755a62"
[[package]]
name = "sdl3-sys"
version = "0.6.6+SDL-3.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04e7f134def04ed72e6f55187c6c29c72f7dab5d359c4be0dd49c9b97fef59c7"
dependencies = [
"cc",
"cmake",
"pkg-config",
"rpkg-config",
"sdl3-src",
"vcpkg",
]
[[package]]
name = "sdl3-ttf-src"
version = "3.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8deaa09c46d6aa8e8a81a601eb4685b2a57f2ce8a4ea3c59e8b623b526d1125"
[[package]]
name = "sdl3-ttf-sys"
version = "0.6.1+SDL-ttf-3.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8137096072109d6c834d4cb30b8a617ded4f150c7766757eddc834108bbcefd2"
dependencies = [
"cmake",
"pkg-config",
"rpkg-config",
"sdl3-sys",
"sdl3-ttf-src",
"vcpkg",
]