Wiki: scrub pseudo-colon em-dashes across user + dev pages
Wiki: tidy two small dev-doc seams
Architecture-Overview Mermaid graph: DSU_CLIENT and BROWSER node labels
were using a bare '.' as the separator between names (Cemu . Dolphin,
Phone . tablet). Changed to ' / ' to match the rest of the graph and
extended the DSU client list to the real four (Cemu / Dolphin / Yuzu /
Ryujinx) the wiki documents elsewhere.
ViewModels.md Per-Device Test Routing row: dropped the reference to
the private Claude memory file (feedback_per_device_test_isolation.md);
restated the rule in-doc and noted the same gate covers the dispatcher
/ routing branches that emit physical effects from those tabs.
ViewModels: note PadViewModel.Touchpad.cs partial-class file
PadViewModel is split across PadViewModel.cs (main) and
PadViewModel.Touchpad.cs (v3.3 Touchpad-tab properties: TouchpadGesturesEnabled,
TouchpadJoystickMaxRadius, TouchpadMouseSensitivityX/Y, etc.). The wiki
page header listed only PadViewModel.cs. Updated to mention both
files + the responsibilities list now includes Touchpad-tab settings.
ViewModels/XAML-Views: refresh SelectedConfigTab + PadPage tab list
Both pages still described the v3.1 tab layout (6 tabs, missing Adaptive
Triggers / Lighting / Gyro / Impulse Triggers and now Touchpad). Walked
PadPage.xaml's RadioButton Tag values and rebuilt the enumeration:
- 6 always-visible (Controller, Macros, Mappings, Sticks, Triggers, FF)
- 5 visibility-gated on the source device's capability flags:
6=Adaptive Triggers (HasAdaptiveTriggers)
7=Lighting (HasLightbar)
8=Gyro (HasGyro)
9=Impulse Triggers (HasRumbleTriggers)
10=Touchpad (HasTouchpad)
XAML-Views.md tab-strip diagram extended to the same 11 entries.
ViewModels: ExtendedSlotConfigData adds ForceFeedbackEnabled (v3.0.3+); replace semicolon pseudo-period with period
ViewModels: DeviceRowViewModel adds SdlGuid, HasTouchpad, IsInternalVirtual + 3 ShowInputXxxSection gating flags for web/overlay virtual sources
ViewModels: DevicesViewModel touchpad fields (IsTouchpadDevice, HasTouchpadData, TouchpadX0/Y0/X1/Y1, TouchpadDown0/Down1) on the Devices-page raw input display
ViewModels: ProfileShortcutViewModel SwitchModes adds ToggleVCsDisabled (v3.2); correct SwitchProfileModeItem shape (ObservableObject class with mutable DisplayName, not record)
ViewModels: extend MacroTriggerMode (+CustomExpression) and MacroActionType (+ToggleTouchpadOverlay, Lightbar*, Rumble*) enum value lists; add MacroLightbar/Rumble hold-mode enums
ViewModels: PadViewModel shift-layer surface is ActiveLayerMask + LayerTabs + LayerActivated event (not CurrentLayerMask / ActiveLayers / LayerEngaged+Released)
ViewModels: document DashboardViewModel Touchpad Overlay section (v3.2) and ResetTouchpadOverlayPositionRequested event
ViewModels: add SettingsViewModel.KeepHidHideCloaksBetweenLaunches
ViewModels: document PadViewModel Constant Force + Impulse Triggers tab (Impulse / Constant Trigger Force / Audio Bass Trigger Rumble) properties new in v3.2
VirtualControllerType enum identifier is Xbox (not Microsoft — that's only the XmlEnum on-disk back-compat name)
ViewModels: add NavControllerItemViewModel.IsVirtualControllerConnected; fix EngineStatusBrush colors (RedBrush stopped, not Gray)
Polish: more pseudo-period semicolons fixed; correct stale v2-dev branch refs in Build-and-Publish
Strip em-dash pseudo-colons and pseudo-period semicolons across wiki prose
ViewModels: HIDMaestro registers itself via HMContext.InstallDriver(), not DriverInstaller
Driver Status: HIDMaestro section said: 'The user-mode driver still
needs to be installed once, which DriverInstaller handles on first
run from Settings.' Contradicts Driver-Installation-Internals.md
line 5 ('It is not installed by DriverInstaller') and the actual
code path (HMContext.InstallDriver() called from
InputManager.Step5.VirtualDevices.cs:EnsureHMaestroContext on first
engine start).
Rewrote to attribute the registration to the engine-side path with
the file:method citation.
Dev wiki: more em-dash pseudo-colons -> periods
ViewModels.md: HmInactivityDestroyTimeoutSeconds description em-dash
attaching the 'only the live VC is destroyed' clarification.
Services-Layer.md: Profile-restore Topology step had both a
semicolon (pseudo-period) and an em-dash (pseudo-colon) attaching
slot-diff outcomes; the device-assignment step had another em-dash
attaching the unchanged-mapping promise. Three sentences each now.
Input-Pipeline.md: 'preserve nodes path is gone — HM creates and
destroys...' em-dash was a pseudo-colon attaching the v3 behavior.
Pass 14: ViewModels.md PadViewModel adds v3.2 properties (MappingSet/CurrentLayerMask/ActiveLayers, TestRumbleTargetGuid, TouchpadClickPressed/Touchpad fingers)
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).
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
Lighting tab reset buttons + v3 terminology sweep
Refreshes pad-lighting screenshot to capture the four new reset buttons
(Lightbar Mode, LED Brightness, Player Pattern, Mute LED Mode) plus the
rest of the slot-0 PadPage tabs and slot-type config bars against the
post-deploy build.
Wiki prose: drops residual v2 phrasing (ExtendedConfig.IsGamepadPreset,
DualShock4 / Xbox 360 enum names, "Microsoft" / "Sony") and routes through
the v3 OutputType / VirtualControllerType vocabulary instead.
Inactivity timeout: clarify slot config is preserved (VC torn down only)
Wiki sync: drag-reorder rebuild logic + DS4/Microsoft identifier renames
User-facing: documents the profile-aware drag-reorder behavior on the
Dashboard. Active controllers in a group constitute their own ordering;
the kernel rebuild fires only when an active VC's relative position to
other actives changes such that a profile mismatch results.
- Controller-Slots: new "What rebuilds on reorder" subsection.
- Dashboard: drag-reorder paragraph extended with one-sentence summary.
- 3D-and-2D-Visualization, Devices, Profiles, Macros, Troubleshooting:
residual Xbox 360 / DualShock 4 family-name leakage replaced with
Xbox / PlayStation in user-visible prose. Web-controller layout slugs
and specific HM profile names left as-is.
Dev pages: reflects the v2-era identifier renames in code that landed
in 005ef8e + dc5b9fd:
- Architecture-Overview, Settings-and-Serialization, Virtual-Controllers:
MaxDS4Slots -> MaxPlayStationSlots.
- ViewModels, XAML-Views: DS4Count -> PlayStationCount.
- Services-Layer: rewrote SwapSlots / MoveSlot entries + added a new
RebuildKernelOrderAfterReorder subsection covering the simplified
single-pass live-subsequence comparison (replacing the older
ShouldRebuildKernelOrder predicate). Also corrected a stale Xbox360
enum default in the CreateSlot row to Microsoft (the actual preserved
enum identifier).
- Input-Pipeline: cross-reference added to the Services-Layer reorder
section since kernel-allocation rebuild lives in InputService.
Preserved: VirtualControllerType.Microsoft enum value, MaxXbox360Slots
constant, [XmlArray("MicrosoftSlotOrder")] attribute string, web layout
slugs, ControllerModelDS4 / ControllerModelXbox360 class names, asset
folder paths, HM JSON vendor "Microsoft"/"Sony" filter strings, all
genuine Microsoft.Win32 / Microsoft.Windows.Devices.Midi2 / registry
references.
Fix mojibake throughout the wiki + rewrite Input-Precision Stage 5 for v3
Mojibake sweep: 1067 sequences across 17 .md files. Earlier passes had
round-tripped UTF-8 punctuation through a CP1252 layer, baking the literal
three-character mojibake into the files (em-dash → â + € + ", en-dash,
right arrow, box-drawing chars, middle dot, multiplication sign, etc.).
Restored to the proper Unicode codepoints: — – → ↔ ← │ ├ └ · ×.
Input-Precision Stage 5 rewrite: the page still described 'Stage 5: vJoy
Output (15-bit unsigned)' which doesn't exist in v3. v3 has a single
HIDMaestro Output stage with three sub-cases:
- Microsoft (Xbox 360): signed 16-bit sticks, 8-bit triggers
- PlayStation (DS4): 8-bit sticks AND triggers (DS4 protocol)
- Extended (HM custom HID): 16-bit unsigned sticks, 8-bit triggers
by default, raisable to 16-bit per profile
Verified against HIDMaestro's HidDescriptorBuilder.cs (AddStick default
bits=16, AddTrigger default bits=8) and PadForge's HMaestroVirtualController.cs
(SubmitGamepadState normalizes through float at the SDK boundary).
Output Throughput section: dropped the vJoy single-IOCTL note, replaced
with HIDMaestro single-call SubmitState description. Summary table
axis-resolution rows now reflect per-VC-type wire bit depth.
Stage 3 callout pointing at Stage 5. Pseudo-colon em-dash converted to
period per the project style rule.
Rewrite Engine-Library / ViewModels / XAML-Views / Settings-and-Serialization for v3
Engine-Library: collapsed IVirtualController implementations to v3's three
classes (HMaestroVirtualController, MidiVirtualController,
KeyboardMouseVirtualController). VJoyRawState renamed conceptually to
ExtendedRawState; VJoy custom mappings to Extended custom mappings. Added
the v2-to-v3 enum migration note (Xbox360 -> Microsoft, DualShock4 ->
PlayStation, VJoy -> Extended) so v2 PadForge.xml files still load.
ViewModels: removed fabricated IsHIDMaestroInstalled / Install&UninstallHIDMaestroCommand
rows; HIDMaestro is bundled, only HidHide + MIDI Services remain in driver
status. Added HmInactivityDestroyTimeoutSeconds row. Renamed vJoy
configuration subsection to Extended Configuration; OutputType default
fixed to Microsoft.
XAML-Views: switched framework references from ModernWPF (Valkirie) to
WPF UI 4.2 (Lepo.Wpf.Ui). Slot-card type buttons listed as
Microsoft / PlayStation / Extended / KB+M / MIDI. Replaced vJoy Config Bar
section with HMaestroProfileBar + ExtendedConfigBar matching the live XAML.
SettingsPage HIDMaestro card has no Install/Uninstall buttons (embedded).
Settings-and-Serialization: ExtendedConfigs / Extended custom mappings
terminology throughout. Save Flow mermaid node updated. SlotControllerTypes
default = Microsoft. All XML element names verified against a live
PadForge.xml.
Each page's stale v3 banner replaced with a current banner stating the
page has been rewritten and pointing to HIDMaestro Deep Dive for
architecture rationale.
Architecture-Overview: refresh Mermaid diagram for v3 (HM thread pool, OpenXInput, 5 categories) + add v3 caveat banner to 7 dev pages
The Mermaid diagram now reflects:
- 5 controller categories (Microsoft / PlayStation / Extended / KBM / MIDI)
instead of v2's Xbox360 / DualShock4 / vJoy.
- HM lifecycle thread pool as a separate node feeding the three HM-backed
categories (Microsoft, PlayStation, Extended).
- OpenXInput shim as a sibling to SDL3.dll under External Systems.
- HIDMaestro driver as the single virtual-HID-output driver (replacing
ViGEm + vJoy nodes).
- Windows MIDI Services as the MIDI backend.
The 7 deeper dev pages (Driver-Installation-Internals, Input-Pipeline,
Virtual-Controllers, Engine-Library, ViewModels, XAML-Views,
Settings-and-Serialization) get a 'Note for v3' banner pointing readers
to HIDMaestro-Deep-Dive as the canonical source for v3 implementation
detail. The terminology in those pages was already swept; the
implementation-detail sections still describe v2 mechanics until a
follow-up content rewrite.
Bulk v3 terminology sweep across remaining wiki pages (23 files)
Mechanical s/// pass on the names that don't depend on architectural
context: ViGEmBus -> HIDMaestro, ViGEmClient -> HIDMaestro SDK,
VJoy -> Extended (the C# enum value name appearing in narrative text),
'DirectInput (vJoy)' -> 'Extended (HIDMaestro)', 'Xbox 360 / DualShock 4'
(slot type pair) -> 'Microsoft / PlayStation', etc.
Pages already hand-rewritten upstream were left alone (Home,
Installation, Driver-Management, HIDMaestro-Deep-Dive). Virtual-Controllers
got the same pass since it's a central reference.
Caveat: many of the deeper architecture pages (Driver-Installation-
Internals, Input-Pipeline, ViewModels, XAML-Views, Engine-Library, etc.)
still describe v2-era *implementation* (vjoy.sys SetupAPI device-node
creation, ViGEm.Client P/Invoke surface, etc.). The TERMINOLOGY now
matches v3 but the IMPLEMENTATION DETAILS in those pages are still v2 and
need a follow-up content pass to reflect the HIDMaestro SDK surface,
the OpenXInput shim, the HM thread-pool lifecycle, the bubble-up
cascade, etc. See HIDMaestro-Deep-Dive.md for the v3-correct version of
that material.
Sweep em-dash pseudo-colons across developer reference pages