Engine-Library: TouchpadClick is Buttons[16], not [21] (matches current SdlDeviceWrapper layout)
0e4a23c
Driver-Management: OpenXInput is embedded in single-file EXE; devobj.dll deliberately not bundled
4dbbe78
Wiki Pass 3 user-facing audit
Installation: OpenXInput now embedded in single-file EXE (drop the
"and devobj.dll" — devobj is NOT bundled, per the architectural rule
that ships only xinput1_4.dll and lets system32 resolve devobj
unaided). Replace the obsolete Accept/Decline UAC table — PadForge
declares requireAdministrator now, so the non-elevated branch is gone.
Force-Feedback: fix "dualSense" → "DualSense" casing typo in the
Related pages list.
81070fb
Wiki Pass 3: dev-deep-dive accuracy corrections
ViewModels: HMaestro SDK assembly is HIDMaestro.Core (not
Microsoft.HIDMaestro.SDK); user-mode driver still needs first-run
installation, not just an embedded assembly.
SDL3-Integration: drop the _filteredVigemInstanceIds field documentation.
That field is gone from current InputService.cs. HM virtuals are filtered
upstream by the SDL3 fork's patched SDL_GetJoysticks (walks container ID
to the HM root enumerator and drops matches before returning the list),
so the engine no longer needs the rumble-killing-close guard.
Architecture-Overview / Driver-Installation-Internals / Build-and-Publish /
HIDMaestro-Deep-Dive: OpenXInput corrections. xinput1_4.dll is bundled
inside the single-file EXE via Content + IncludeNativeLibrariesForSelfExtract,
not "copied adjacent to PadForge.exe". devobj.dll is deliberately NOT
shipped (a bundled stub would hijack setupapi.dll's own DevObj* imports
and crash HID class enumeration per PadForge #69). System devobj.dll
resolves from System32 unaided.
Also: refresh pad-playstation-configbar.jpg to match the canonical PS
slot screenshot (DualSense (PS5, Bluetooth) profile, dualsense-bt).
5efdc7f
Wiki: Pass 2 — dev-deep-dive accuracy + Home page voice match
Architecture-Overview: AssemblyInfo.cs → SharedVersion.cs; expanded
Data/ file list to include MappingSet/MappingSource/MappingRow/
ShiftActivator/MappingSetMigrator/DeviceTuning.
Input-Pipeline: drop preserveExtendedNodes parameter; rebuild field
table to match current InputService.
Virtual-Controllers: VendorId==0xBEEF check replaced with
DescriptorHasPidFfbBlock(descriptorHex) gate in three locations.
HIDMaestro-Deep-Dive: Microsoft.HIDMaestro.SDK → HIDMaestro.Core
(bundled at Resources/HIDMaestro/HIDMaestro.Core.dll); fix
context.CreateController(profile) call shape.
Services-Layer: drop preserveExtendedNodes from Stop(); remove the
"step 9" preserve-nodes branch.
Engine-Library: add TOUCHPAD = 0x0800 button flag row.
SDL3-Integration: SDL3 fork now filters HM virtuals at
SDL_GetJoysticks, so the engine no longer maintains
_filteredVigemInstanceIds. Updated Mermaid flowchart and renumbered
the connect-side step list.
Home: "New in 3.2" rewritten from bullet lists to story paragraphs to
match the website voice. Added Gyro / Impulse Triggers / Shift Layers
to the navigation tables.
527cde8
Pass 11/25: trim 'actually' filler from Button-and-Axis-Mappings, Adaptive-Triggers, Macros
72c80eb
Pass 10/25: refreshed screenshots for 3.2 + image refs on every user-facing page
Screenshots
- Recaptured all 21 PNGs in images/ against a 6-slot setup (Xbox + Xbox + PlayStation + Extended + KBM + MIDI) so every controller-type screenshot reflects the live 3.2 UI.
- New pad-gyro.png covers the dedicated Gyro tab (Calibration, Sensitivity, Response Shaping, Engage, Easy Aim cards).
- pad-adaptive-triggers and pad-lighting captured on slot 1 where a DualSense source makes those tabs visible. The old captures were the Controller 3D view instead of the actual tab content -- the Tab(...) Click was being called before the tab strip had switched, and on PS slot 3 the AT/Lighting tabs are hidden when a DS4 (not DualSense) is the source.
capture.ps1 + convert-screenshots.ps1
- capture.ps1 now self-elevates. PadForge runs requireAdministrator; a non-elevated UIA reader returns zero descendants (UIPI), which silently made every Nav/Tab call fall through to a no-op.
- Dropdown captures target by AutomationId (DeadZoneShapeCombo, SensitivityXCombo, TriggerPresetCombo) instead of iterating every ComboBox looking for an item by name -- the old approach kept expanding the HMaestroProfileCombo and assigned-device combo by accident.
- Tab() ScrollIntoView before Click for wrapped tab strips.
- Capture for Gyro / Adaptive Triggers / Lighting on slot 1, gated on each tab being visible (Tab returns false if collapsed, the Cap call is skipped instead of capturing whatever's stale on screen).
- convert-screenshots.ps1: added pad-gyro / pad-impulse-triggers / pad-shift-layers to the name map.
Image refs on pages that previously had none
- Gyro.md: pad-gyro.png
- Installation.md: add-controller-popup.png (first thing you reach after install)
- DSU-Motion-Server.md: dashboard.png (the Motion Server card lives there)
- Troubleshooting.md: settings.png (where most troubleshooting starts)
- Input-Precision.md: pad-sticks.png (where the precision pipeline ends up visible)
- Shift-Layers.md: pad-mappings.png (shift layers live in the mappings tab strip)
- Impulse-Triggers.md: pad-forcefeedback.png as a stand-in (Impulse Triggers tab is only visible when an Xbox One+ pad is assigned, which the dev environment doesn't have; the Force Feedback tab shares the same layout pattern).
1261954
Pass 9b/25: capture.ps1 now targets TriggerPresetCombo by AutomationId + adds Gyro and Impulse Triggers captures. Home.md nav table grows.
capture.ps1:
- Trigger sensitivity dropdown switched from item-probe (which kept hitting HMaestroProfileCombo / device dropdown by accident) to AutomationId "TriggerPresetCombo". All three dropdown captures now target by AutomationId.
- Added pad-impulse-triggers and pad-gyro captures on slot 1, gated on the tab being visible.
Home.md:
- "Map a button or axis" now links Button-and-Axis-Mappings and Shift Layers explicitly.
- "Tune the feel" includes Gyro and Impulse Triggers alongside the existing tuning tabs.
- "Power features" mentions Custom Expression triggers in the Macros row and the bulk virtual-controller toggle in the Profiles row.
2a04ee9
Pass 9/25: capture.ps1 fixes -- self-elevate + ScrollIntoView tabs + AutomationId-targeted dropdowns
- Self-elevate at the top of the script. PadForge runs requireAdministrator, so a non-elevated UIA reader returns zero descendants (UIPI). Without this, FindAll on PadForge's window returns nothing and every Nav/Tab call falls through to a coordinate-click on stale UI.
- Tab() now ScrollIntoView before clicking. The TabStripButton style fires its handler on the Click event, not on IsChecked-via-SelectionItemPattern, so a real click is required. When the strip wraps at narrow widths, ScrollIntoView brings the target row into view first.
- Dropdown captures use AutomationId where the XAML has one: DeadZoneShapeCombo and SensitivityXCombo for the Sticks dropdowns. The old "iterate every ComboBox and probe item names" approach kept expanding the Preset and Assigned-Devices combos on the slot header, capturing the wrong dropdown.
- For combos without an AutomationId (Triggers sensitivity), the fallback Capture-PadPageDropdownByItemName confines the search to the PadPageView subtree and explicitly skips AssignedDevicesCombo / ProfileCombo / PresetCombo / DeviceCombo.
Macros.md: Custom Expression Variables section rewritten in a less defensive tone. "Add as many variables as the formula needs. Each one becomes a letter -- 'a' for the first, 'b' for the second, then 'c', 'd', 'e', and as many more as you add." Replaces the AI-shaped "Each row in the **Variables** table binds one letter to one input."
a04ed7b
Pass 8/25: Related-pages first-word lowercase normalization + Stick-Deadzones 'Best for:' pseudo-colon sweep
41 Related-pages bullet first-words lowercased to match the established 'Page: lowercase description.' convention. Proper nouns (Xbox, DualSense, Sony, HIDMaestro, etc.) kept capitalized. One DualSense->dualSense miss caught and restored. Stick-Deadzones 'Best for:' colon-pseudo pattern dropped on all five deadzone-shape captions.
7c0f818
Pass 7/25: rebuild Related-pages sections on Adaptive-Triggers, 3D-and-2D-Visualization, Lighting
The earlier Related-pages normalization script collapsed lines like '- [[Force Feedback]] and [[Trigger Deadzones]]: tuning the body rumble and trigger floor' into '- [[Force Feedback]]: [[Trigger Deadzones]].' because it treated the first colon as the description separator. Each affected line now has a real description and links break out into separate bullets when they describe distinct pages.
7e7f590
Pass 6/25 cont'd: Impulse-Triggers placeholder image reference removed -- pad-impulse-triggers.png doesn't exist yet, so rendering was broken on the live wiki
1df8fbe
Pass 6/25: Architecture-Overview 'Reverse data flow' heading lost its trailing colon (AI smell)
a423d0c
Pass 5/25: VC abbreviation purge from user-facing prose
Replaced "VC" with "virtual controller" or "controller" in user-visible text on Home.md (Misc 1 -> Share bullet), Controller-Slots.md (yellow power-icon explanation, disabled-slot reorder note), Driver-Management.md (HIDMaestro stuck-on-initializing troubleshooting). "Xbox virtual gamepad" and "PlayStation virtual gamepad" labels in the Add-controller type table now say "virtual controller" to match the rest of the wiki.
063483b
Pass 4/25: verification pass -- fixed one broken intra-page anchor on Input Pipeline (double-dash slug)
ede4695
Pass 3/25: Stick-Deadzones Scaled Radial caption rhythm tightening (three-fragment burst into two)
bc223d0
Pass 2/25: italic hook consistency, Related pages normalization, em-dash sweep
- Italicized hook line on 12 user-facing pages that had plain hooks (Stick-Deadzones, Trigger-Deadzones, Force-Feedback, Adaptive-Triggers, Lighting, Devices, DSU-Motion-Server, Web-Controller, Settings, Driver-Management, Input-Precision, 3D-and-2D-Visualization) and Troubleshooting.
- Normalized Related-pages bullet formatting across 16 user-facing pages to one convention: '- [[Page]]: lowercase description.'
- Home.md: cut filler 'long list of smaller wins' from the 3.2 intro paragraph; replaced em-dash pseudo-colon with a period; converted em-dash pseudo-colon in Gyro motion bindings bullet.
- Controller-Slots.md: Open-a-slot tab list now reflects 3.2 reality (Gyro tab, Adaptive Triggers and Lighting on PS slots, Impulse Triggers on Xbox + PS). Related pages expanded to link the new pages.
- Devices.md and Impulse-Triggers.md: em-dash pseudo-colons converted to periods.
b795ae7
Pass 1/25: wiki link audit + empty-header table cleanup + 2026 Steam Controller mention
- All 29 reversed [[Display|Target]] gollum links fixed
- 1 broken anchor on Virtual-Controllers link to HIDMaestro Deep Dive resolved against actual heading slug
- Lighting.md image path corrected (lighting.png -> pad-lighting.png)
- 10 empty-header 2-col "| | |" label tables rewritten as prose paragraphs across Controller-Slots, Installation, Devices, Dashboard, Settings, Web-Controller
- Home.md "New in 3.2" now lists 2026 Steam Controller support via the bundled SDL3 fork
6fadca4
Wiki: add Gyro / Shift Layers / Impulse Triggers, expand Mappings + Macros for 3.2 features
New pages
- Gyro: dedicated tab covering calibration, sensitivity, response shaping, engage gates, reference frames, per-(device, slot) persistence, per-source GyroSensitivity multiplier.
- Shift Layers: per-slot mapping tables that activate while a button / chord / axis is engaged. Five activation modes, three activator kinds, per-layer color + emoji, Win11 flyout, last-engaged-wins resolution.
- Impulse Triggers: split out of Force Feedback since the app has it as its own Pad-page tab. Covers game-driven passthrough (Xbox + DualSense), Constant Trigger Force, Audio Bass Trigger Rumble.
Updated
- Home.md "New in 3.2" now covers the full 3.2.0 feature set: mapping engine rebuild, shift layers, gyro Steam Input parity, impulse triggers tab, macro custom expression, lighting additions, platform changes.
- Button-and-Axis-Mappings.md: per-VC scope, multi-source rows, six combine modes + custom formula, source kinds (Direct / Incremental / Invert On Hold), Bidirectional flag, direction badges, auto-mapping extend behavior.
- Macros.md: Custom Expression trigger mode (formula + variables + recipes), multi-device combos in triggers, per-entry axis options.
- Force-Feedback.md: trigger-motor sections moved to Impulse Triggers; cross-link added.
079ec80
Wiki rewrite: simple-English voice across all user-facing pages
Rewrites 18 user-facing pages and adds hooks to 7 dev-deep-dive pages.
Each user-facing page now opens with H1 then a one-sentence hook,
strips banned vocabulary, replaces em-dash pseudo-colons with periods,
and ends with a version marker.
User-facing rewrites
- Installation, Dashboard, Controller-Slots, Button-and-Axis-Mappings
- Stick-Deadzones, Trigger-Deadzones, Force-Feedback, Adaptive-Triggers, Lighting
- Macros, Profiles, Devices, DSU-Motion-Server, Web-Controller
- Settings, Driver-Management, Input-Precision, Troubleshooting
- 3D-and-2D-Visualization
New 3.2 content woven into Force-Feedback (Impulse Triggers, Audio Bass
Trigger Rumble, Constant Trigger Force) using actual in-app labels from
Strings.resx. Profiles documents the new Toggle Virtual Controllers
Disabled shortcut mode. Settings notes the stable-across-language-switch
fix. DSU Motion Server covers the Gyro Aim Engage picker subtitle.
Dev-deep-dive hooks added
- Input-Pipeline, Settings-and-Serialization, ViewModels, XAML-Views, Engine-Library
6348420
Rewrite Home: simple-English pitch + What's new in 3.2 + reorganized navigation
- Lead "Make any input look like any controller." with three concrete pairings
- Add "New in PadForge 3.2" with six user-visible changes
- Group nav into Get started / Pick a type / Tune the feel / Power features / Behind the scenes / Developer reference tables
- Plainer voice across descriptions
d2e4017
v3.1.4: web controller artwork note + atomic screenshot refresh
c6ef681
v3.1.4: replace pad-controller-2d screenshot with actual 2D view
961b53b
v3.1.4: refresh screenshots + Xbox Series Share + per-profile asset notes
014aa02
Document constant force + rumble macro action (v3.1.3)
0572aa8
Adaptive Triggers: document Load GameCube preset button (#78)
42a4fc0
v3.1.1 screenshot refresh
3bb81e6
v3.1.1: per-device Lighting / FFB, Input Reactive overlay, macro lightbar actions
175731c
Settings: document Keep Devices Cloaked Between Launches toggle
0d93e38
Wiki: note Lighting tab reset buttons + Web Controller Touchpad layout
e572e0f