Skip to content

refactor(transform): remove the legacy transform cursor (#384) - #388

Open
Maxaubert wants to merge 5 commits into
mainfrom
refactor/384-remove-legacy-transform-cursor
Open

Maxaubert wants to merge 5 commits into
mainfrom
refactor/384-remove-legacy-transform-cursor

Conversation

@Maxaubert

Copy link
Copy Markdown
Owner

Closes #384. From the 2026-10-08 full review (research/wind/2026-10-08-full-review.md).

The transform engine is native-cursor only now. Removed: the txNativeCursor=0 sprite session and the sprite's cursor-shape rendering (the Inspect crosshair stays), cursorSprite/spriteBand16/spriteCapturable, the shell-panel pointer freeze, the txHookWrite hook write path and mag_thread marshalling (nothing claimed it, so every call already ran inline on the tick thread), txFreeCursor=0, txDwmCentre=0, the cadence gates (txWriteHz, txMinOffsetPx, txLevelStep, txGrid), warm modes 2-4, txPace experiments, the wobble cage, idle-release members, WallBinding, swapModelVk, trackGlideMode 0 + GlideToward. Kept: render engine and its cursor, lock path (mouselook keeps the weld), Inspect, cursor lens, nudges, DWM centring, cursor tint, edgeClip, churny apps, device-lost backstop. Old keys in user inis are ignored. 709 insertions, 3656 deletions.

Verified on this PC with all four PRs combined (signed UIAccess deploy): unit suite passes; frame-capture harness: held-button shake 0 jumps (27 writes / 564 moves), free and forced-lock pointer 0 px spread at ~6x; unreadable-ini test passes; tray layout key mid-zoom keeps the zoom; Inspect enters and exits cleanly (the crosshair is capture-excluded, so it was not seen by the capture). Not tested: mouselook in a real game (pointer hidden), which keeps the weld path.

🤖 Generated with Claude Code

https://claude.ai/code/session_011zPmivSAQeivGUdBjTsaMu

Maxaubert and others added 5 commits October 8, 2026 14:44
The transform engine now always draws DWM's own pointer (native cursor). Removed:
txNativeCursor and every !nativeSession_ branch of TransformModel (zoom-in sprite bridge,
shell-panel real-pointer branch, sprite draw branch), CursorSprite shape rendering
(refreshShape, renderMaskShape, shape cache), spriteBand16, spriteCapturable and the
cursorSprite knob (the blanker and the Inspect crosshair sprite are now always created, which
also fixes cursorSprite=0 disabling the hide-cursor hotkey), the shell-panel pointer freeze
(panelPointer, panelFreeze, ex.realPointer), txFreeCursor=0,
txDwmCentre=0, idle context release (txIdleReleaseMs) and the sprite telemetry columns.

Kept: the Inspect crosshair, the blanker, the hide-cursor hotkey path, the locked/Inspect weld,
the cursor lens and public-API prime fallback, cursorBandAuto/zorderBand for the crosshair.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011zPmivSAQeivGUdBjTsaMu
…rshalling

txHookWrite (default off, incompatible with DWM centring) is gone with everything that existed
only for it: hook_transform.*, hook_geometry.h, the WH_MOUSE_LL inline write and arming in
RunTick, PresentExtras::suppressTransformWrite, DwmCentreIn::hookWrite, the hook-era lag and
swim telemetry columns (w_hook, lag_px) and the composite frame gate.

mag_thread.* only marshalled onto the hook thread when that path claimed the runtime; with no
claim every MagThreadInvoke already ran inline. Verified every user (mag_host, color_filter,
render_engine, transform_model, input_router) and unwrapped them to direct calls, so the
cursor lens and every other Magnification call behave exactly as before. MagHost loses
setTransformOwned and the *Owned acquire/release split.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011zPmivSAQeivGUdBjTsaMu
… and the wobble cage

Measured-negative experiments that shipped off and are no longer reachable from the UI:
txWriteHz, txMinOffsetPx (tx_cadence.h and its tests), txLevelStep, txGrid, warm modes 2-4
(same-value, input-transform, level epsilon) with txWarmMaxLevel, txWarmWindowMs and
txWarmLevelEps, txPace 1 and 2 (the composite pulse thread and the hitch recorder's pulse
fields and causes) and the WobbleCage diagnostic (wobble_cage.*, txWobbleCage[Size]).

Every changed tick is written, exactly what the defaults already did. The shipped 1px warm
pulse (txWarmMode 1, txWarmHz) stays for the views Wind writes itself (locked, Inspect, detached);
retired warm values read as 1. The trace now marks pulse ticks in its warm column, which stayed
empty in the shipped mode.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011zPmivSAQeivGUdBjTsaMu
…removal

WallBinding (replaced by NearWall) and its test, the swapModelVk field and its test, the
drag-follow weldActive argument (always true), trackGlideMode 0 with GlideToward (the spring
is the only tracking glide), the shell input panel watcher in the focus tracker (its only reader
was the removed panel pointer freeze, so the cloak WinEvent hook and the 250 ms idle timer go
too) and the empty TransformModel::onActivate override.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011zPmivSAQeivGUdBjTsaMu
Rewrite the cursor, transform-engine, tick-loop, config and instrumentation chapters, CLAUDE.md
and the findings records for the removed sprite cursor, hook writes, cadence gates, warm modes
2-4, composite pulse pacing and wobble cage. The default ini template and the architecture docs
no longer name removed keys. Tools tied to removed knobs are deleted (dualcursor.ps1,
wind_cadence_ab.ps1) or adjusted (gpu_ab, zoom_response_ab, the wobble probes now ignore a
hidden crosshair window).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011zPmivSAQeivGUdBjTsaMu
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Remove the legacy transform cursor (sprite fallback, hook writes, old pan modes, dead experiments)

1 participant