We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Pass 33: Home nav table enriches Web Controller (16 phones, touchpad layout) and adds Touchpad Overlay row
Pass 32: Dashboard.md adds Touchpad Overlay section (on-screen transparent touch surface, was undocumented)
Pass 29: Settings.md documents the HM Inactivity Timeout setting (Input Engine section)
Pass 28: tighten 'the user can enable' → imperative 'enable'
Pass 27: punchy-voice sweep — drop 'various', 'not just X but Y' defensive parenthetical, 'actually' filler
Home: open the Map section by noting recognized gamepads auto-map on assign
Pass 24: Architecture-Overview mermaid OpenXInput label drops devobj (only xinput1_4.dll is bundled; devobj resolves from System32)
Pass 23: SDL3-Integration mermaid drops dead FILTER/SKIP1/SKIP2/SKIP3 style refs (nodes were removed when HM filter moved fork-side); Step1 source-files line corrected
Pass 17: Engine-Library TOUCHPAD button-flag row clarifies output-side bitmask (Gamepad.Buttons) vs input-side array index (CustomInputState.Buttons[16])
Pass 16: Engine-Library CustomInputState adds TouchpadFingers + TouchpadDown fields (live in v3) and notes Buttons[16] is SDL_GAMEPAD_BUTTON_TOUCHPAD
Pass 15: Services-Layer InputService section adds TestRumbleTargetGuidProvider per-device gating + ToggleVCsDisabled bulk-toggle flow (both new in 3.2)
Pass 14: ViewModels.md PadViewModel adds v3.2 properties (MappingSet/CurrentLayerMask/ActiveLayers, TestRumbleTargetGuid, TouchpadClickPressed/Touchpad fingers)
Pass 13: XAML-Views Tab Visibility Rules — add Impulse/Adaptive/Lighting/Gyro tabs and the per-device capability gates that drive their visibility The table only covered the always-visible tabs (Controller / Macros / Mappings / Sticks / Triggers / Force Feedback). The capability-gated tabs introduced or revamped in 3.2 (Impulse Triggers, Gyro) and their predecessors (Adaptive Triggers, Lighting) were missing, even though PadPage.xaml.cs lines 306-313 control their visibility on every mapped-device change.
Pass 10: Input-Pipeline 'Custom vJoy' / 'vJoy state' renamed to 'Extended Custom HID' / 'Extended-raw state' v3 uses HIDMaestro for Extended profiles. The wiki kept calling those 'Custom vJoy' / 'vJoy mapping' / 'vJoy button words' which is wrong on the driver name. Renamed throughout the active code-flow sections. Historical-narrative sections (lines 225, 1263) still use 'v2 vJoy' to describe what's removed; those stay.
Pass 10: 3D-Model-System architecture diagram includes ControllerModelXboxOne and ControllerModelDualSense (added since the page was last updated)
Pass 9: Virtual-Controllers HMaestroFfbDecoder dispatch list — break the run-on semicolon clause into a bulleted list
Pass 9: HIDMaestro bundled version is 1.3.12, not 1.2.0/1.2.1 (FileVersion read from HIDMaestro.Core.dll)
Pass 8: assembly versioning lives in repo-root SharedVersion.cs, not Properties/AssemblyInfo.cs App and Engine share one version via the linked SharedVersion.cs at the repo root. Wiki claimed AssemblyInfo.cs held the version (and listed stale 2.1.0.0 / 2.0.0.0 values), which is wrong on three counts: wrong file, wrong version numbers, wrong drift model (versions are shared now, not independent). Also fix the release-workflow step that pointed at AssemblyInfo.cs.
Pass 6: remove fabricated 'per-slot DSU toggle' + Motion-tab references; Trigger-Deadzones related-pages cleanup DSU-Motion-Server: there is no per-slot DSU broadcast on/off switch and no separate 'Motion' tab. Gyro tuning lives on the Gyro tab. Rewrote the per-slot section to point at the Gyro tab and to state plainly that the Dashboard switch is the only DSU enable. Trigger-Deadzones: point trigger-motor rumble settings to the Impulse Triggers tab (where they live in 3.2), not Force Feedback. Fix the 'dualSense' casing in the Adaptive Triggers link.
SDL3-Integration: button layout table now covers SDL extended range (11-21) and shows raw passthrough starts at 22, not 11 The page was a few SDL revisions out of date. Indices 11-21 are SDL's standardized extended gamepad buttons (Misc1, paddles, Touchpad, Misc2-6), which PadForge fills in via SDL_GAMEPAD_BUTTON_* lookups. Only after those do the device-specific raw buttons start (index 22+). The TouchpadClick correction at Buttons[16] now lines up with this table.
Web-Controller: TouchpadClick code is 16 (SDL canonical), not 11 (the old collapsed-numbering scheme)
Pass 4: drop final stale ViGEm/vJoy references (vigem_target_free, _vigemClientLock, PreInitializeVigemCounts)
Drop stale _vigemClientFailed + preserveExtendedNodes references in dev-deep-dive pages
Input-Pipeline: drop ExtendedSyncLock + _createCooldown + vJoy descriptor sync (v2 fields, removed in v3)
Input-Pipeline: drop stale 'CleanupStaleVigemDevices' + 'PreInitializeVigemCounts' sections (methods removed from code)
Architecture-Overview: Step 1 no longer filters HM virtuals; SDL3 fork does it upstream
Input-Pipeline: align fork-filter wording with SDL3-Integration (Hardware ID parent walk, not container-ID walk)
SDL3-Integration: HIDMaestro sentinel is HIDMAESTRO, not Root\HMCOMPANION HMCOMPANION was an earlier HM enumerator name that's been replaced. Current HM PnP chain carries HIDMAESTRO in the Hardware ID list, matched via substring fast path + 4-deep PnP parent walk. The fork follows the same shape as the OpenXInput-side filter so both stay in lockstep when HM device characteristics change.
SDL3-Integration: rewrite Device Filtering section against current fork-side filter The in-engine IsHIDMaestroVirtualDevice classifier was removed when the SDL3 fork landed the container-ID-walk filter inside SDL_GetJoysticks. The wiki still documented the old detection-order table + counter-based heuristics + the PnP-tree-walking rationale. All of that is replaced with a brief description of the upstream fork-side filter and a pointer to the feat/hidmaestro-filter branch.
Input-Pipeline: drop the obsolete _filteredVigemInstanceIds + IsHIDMaestroVirtualDevice docs The in-engine filter is gone. PadForge's SDL3 fork now walks each device's container ID to the HIDMaestro root enumerator and drops matches inside SDL_GetJoysticks, so HM virtuals never reach the engine's open loop in the first place. Pruned the tracking-field row, the step that referenced the set, the cleanup IntersectWith block, and the detection-heuristics table.