Headline: the whole pen/tablet input stack (P0–P5) — a pressure-sensitive stylus plane across core wire, Linux, GameStream/Moonlight, Windows, iPad Pencil and Android. Plus touch-injection fixes, cursor-DPI scaling, three Windows-host display/cursor fixes, a gamepad same-PID conflict fix, and the Android mouse/keyboard (TV) regressions. Release notes authored in-repo at docs/releases/v0.19.0.md (first release on the new flow; CI seeds the release body from it). cargo update --workspace syncs the lock (versions only). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.7 KiB
Wire-compatible with 0.18.x — existing pairings and clients keep working. The new stylus plane is capability-negotiated (HOST_CAP_PEN) and rides an additive datagram that older peers never send and never have to parse, so a 0.18 host and a 0.19 client (or the reverse) pair exactly as before and simply fall back to pen-as-touch. WIRE_VERSION stays 2; the embeddable C ABI moves to 13 for one new entry point (punktfunk_connection_send_pen); the Windows display-driver protocol is unchanged at 6 (compat floor 3).
Pen, stylus & tablet — a whole new input plane
Punktfunk streams now carry a first-class, pressure-sensitive stylus, end to end and on every platform. It is its own wire plane — not mouse events in disguise — so pressure, tilt, hover and barrel buttons survive the trip from glass to host.
- The wire (P0). A state-full
RICH_PENdatagram carries batches of up to 8 samples — sub-pixelf32position,u16pressure, hover distance, tilt + azimuth, an eraser tool, and two barrel buttons — ordered by a wrapping sequence number and dropped whole when stale, so a late batch never rewrites the present. APenTrackercoalesces the stream andHOST_CAP_PENadvertises the plane; toward a host without the bit the client keeps its pen-as-touch fallback. - Linux host (P1). A per-session uinput virtual graphics tablet injects the full stylus — pressure and tilt included — and tears down with the session.
HOST_CAP_PENgoes live wherever uinput is available. - GameStream / Moonlight (P2). The host ingests Moonlight's
SS_PEN/SS_TOUCHpointer packets and advertises the matchingfeatureFlags, so a capable Moonlight client sends real stylus onto the same plane. - Windows host (P3).
PT_PEN+PT_TOUCHsynthetic pointer injection drives the Windows pen stack directly — pressure and barrel buttons reach applications as genuine pen input. - iPad (P4). Apple Pencil (including Pencil Pro) capture maps onto the stylus plane — pressure and tilt from the panel, with the cursor-capability fix so the pencil and the pointer coexist.
- Android (P5). Active-stylus capture (S Pen and friends) forwards onto the pen plane with pressure and tilt.
Touch injection, fixed
- Windows native touch actually injects now.
PT_TOUCHpointer ids must be contiguous injector slots, but the host was passing the raw wire touch ids straight through — Windows rejected them silently and Moonlight-native multitouch landed nothing. Wire ids are now compacted into slots, and the first rejection is surfaced with a warning instead of vanishing. - NaN pressure no longer drops a finger. VoidLink's finger touches arrive with a NaN
pressureOrDistance; the GameStream path discarded the whole packet. It now tolerates NaN and injects the touch.
Cursor & pointer polish
- The forwarded cursor is scaled to the video fit on the SDL/Linux and Apple/macOS clients. A high-DPI host pointer was drawn against the client's own backing scale and came out roughly 2× too large; it now renders true-size against the streamed video.
Windows host fixes
- No more
0x57on display-config isolate. When a supplied CCD path is doomed (a Steam Deck's live-deactivate always is), the isolate escalates to a keep-only supplied config instead of failing the whole apply with0x57. - Cursor exclusion is reported adapter-wide. The IddCx declare's cursor exclusion is not a per-target property; the virtual-display driver now reports
cursor_excludedacross the adapter. - Secure-desktop cursor stood down. The IddCx hardware cursor is held down while the Windows secure desktop (UAC / Winlogon) is up, ending the duplicated/stuck pointer there.
Gamepad
- A virtual Steam Deck pad no longer degrades to a DualSense because of an unrelated Steam controller. To stop Steam Input from double-driving two identical controllers, the host downgrades a requested virtual Steam pad to a DualSense when a matching physical Valve controller is present — but the gate matched any
28DE(Valve) device. So plugging a physical Steam Controller 2 (28DE:1302) into the host dropped a client's virtual Steam Deck (28DE:1205) to the wrong pad — the passthrough came up as a DualSense. The gate now keys on the exact VID+PID: distinct Steam controllers coexist (Steam Input drives them side by side fine), and only a genuine same-identity duplicate — a physical Deck alongside a virtual Deck — still degrades.
Android input — mouse & keyboard regressions
Two regressions from 0.18.0's mouse-&-keyboard overhaul, felt most on Android TV boxes:
- Mouse back/forward stays in the stream. A mouse's back/forward buttons were synthesized by the reader as
SOURCE_MOUSEkey events and leaked into Android navigation (yanking you out of the stream on a TV); they're now swallowed while streaming. - Hardware typing no longer pops the IME. The soft keyboard is gated on
imeShown, so typing on a physical keyboard against a text-input host doesn't summon the on-screen IME.
Release & CI
- Release notes now ship with the release. Notes are authored in-repo at
docs/releases/vX.Y.Z.mdand seeded into the release body at creation, and stable releases announce to the Discord#releaseschannel. This file is the first of them. - iOS
.ipaattached. The iOS build exports an App Store-signed.ipato the unified release and to the run artifacts (archival/TestFlight, not a direct sideload).
Versions
WIRE_VERSION 2 (unchanged — 0.18.x hosts and clients interoperate) · C ABI 13 (adds punktfunk_connection_send_pen; embedders recompile) · Windows display driver protocol 6, compat floor 3 (unchanged — pen injects through the Windows pen stack, not the display driver). Windows drivers ship separately, as always.