Skip to content

History / Settings and Serialization

Revisions

  • Add 3.4 developer-reference pages and cross-links New internals pages for Remote Link, Controller Audio, Wheel force feedback, and MIDI input, each grounded in the live source (classes, files, data flow). Link them from the Home developer-reference index. Add the MIDI enumeration phase and the vendor-wheel force-feedback branch to Input Pipeline, the new persisted fields to Settings and Serialization, and the engine-side subsystems note to Services Layer. Also small prose fixes to the user pages: drop a defensive "not input-only" phrasing on Remote Link, fix a link alias on Wheel, Americanize a spelling on MIDI Input.

    @hifihedgehog hifihedgehog committed Jun 15, 2026
  • Semicolon → period: two more pseudo-period uses 3D-Model-System: "Symbol meshes get PlayStation-specific colors; base meshes default to black" — two factual clauses, period works. Settings-and-Serialization: "Multiple UserSettings may reference the same PadSettingChecksum; only one copy is serialized" — same pattern. Both are the AI-tell "X; Y" where Y is a separately complete clause that doesn't strictly belong inside the first sentence.

    @hifihedgehog hifihedgehog committed May 26, 2026
  • Semicolon → period across dev pages The "X; Y" pattern where the two clauses are separately complete reads as the AI-tell pseudo-period semicolon called out in the project's writing style notes. Replace with a period (or comma where the relation is conjunctive) across: - Architecture-Overview (PtpDeviceState description, added in this sweep) - Controller-Slots (Impulse Triggers parenthetical) - Engine-Library (three slot-assignment / template-preprocess paragraphs added in this sweep) - Home (Driver-Installation-Internals table row) - Services-Layer (move-slot-to-group-tail flow) - Settings-and-Serialization (v2 Preset enum migration note) - Troubleshooting (UAC accept step) - Virtual-Controllers (Gamepad struct dispatch note) No semantic changes.

    @hifihedgehog hifihedgehog committed May 26, 2026
  • Settings-and-Serialization: TouchpadSettings collection schema Add a dedicated subsection covering the v3.3 TouchpadSettings collection on PadSetting. Shows the on-disk XML structure (outer Settings wrapper carrying DeviceGuid + TouchpadIndex; nested Settings carrying the actual TouchpadGestureSettings attributes), runtime lookup via the InputManager.TouchpadGestureSettingsProvider Func, and why the collection is excluded from CopyablePropertyNames (deep-copy semantics). Was previously only mentioned in the excluded-properties list with no schema detail; the reader had to read PadSetting.cs and TouchpadSettingsEntry.cs to understand the on-disk shape.

    @hifihedgehog hifihedgehog committed May 26, 2026
  • Settings-and-Serialization: CopyablePropertyNames table refreshed for v3.2 + v3.3 Old table listed 79 properties. Actual array is 129. Added the missing categories: ButtonShare, Impulse triggers (4), Constant trigger force (3), Audio bass trigger rumble (5), Constant force (3), Gyro tuning (25), Touchpad descriptors (7), Motion passthrough markers (2). Excluded section now lists TouchpadSettings (the v3.3 typed sub-tree) and the clipboard-only XmlIgnore payloads (SlotMultiSourceRows, DeviceScopedMultiSourceRows, SlotPerDeviceSettingsJson, SlotPlayStationConfigsJson, SlotExtendedConfigJson, SlotMidiConfigJson). Usage section reflects the __TouchpadSettings + __SlotPerDeviceSettings JSON keys that ToJson now emits.

    @hifihedgehog hifihedgehog committed May 26, 2026
  • Settings-and-Serialization: add 2 missing ComputeChecksum sections Walked PadSetting.ComputeChecksum (lines 984-1244) and found two sections appended to the checksum that weren't documented: - Motion passthrough markers (2): MotionGyro, MotionAccel, between Threshold (1) and the dictionary sections. - Touchpad per-(device, pad) settings (~35 fields per entry), tagged v3.3, prefixed `TPS:`, sorted by (DeviceGuid, TouchpadIndex), serializes the full Touchpad-tab knob set (gesture toggles + thresholds + Stick / D-Pad output + Mouse output). The PadSetting.cs comment above the block explicitly calls out why it has to be in the checksum: two devices with identical mappings but different touchpad-tab settings would collide on dedup-by-checksum, silently dropping one device's per-pad toggles. Renumbered sections 16-19 to 17-20 to make room. Added the Touchpad block as section 21.

    @hifihedgehog hifihedgehog committed May 26, 2026
  • Settings-and-Serialization: fix Gyro tuning field count + names Section 13 listed "~24, v3.2" and omitted three Gyro fields that ARE in the checksum at PadSetting.cs:1127-1130: - GyroAimEngageMode (drives Hold vs Toggle for Aim Engage) - GyroApplyTuningToPassthrough (controls whether per-pad tuning affects passthrough output) - GyroInvertYawRoll (renamed property; wiki had the old XML name GyroInvertYaw) Bumped count to 25 (matches the actual checksum field list), added the two missing, corrected the Invert property name, noted the XmlElement back-compat alias. Tagged the section v3.2 + v3.3 since AimEngageMode and ApplyTuningToPassthrough landed later.

    @hifihedgehog hifihedgehog committed May 26, 2026
  • Wiki: purge references to four classes removed from the codebase CustomInputUpdate, CustomInputHelper, DeviceEffectItem, and RumbleLogger no longer exist in PadForge.Engine — they were removed at some point and the wiki still documented them in detail across five pages. Cross-checked with grep across both projects: zero call sites remain in source. Removed: - Engine-Library.md: ToC entries + full sections for all four, plus UserDevice.InputUpdates / OldInputUpdates rows that referenced the dead CustomInputUpdate[] type. - Architecture-Overview.md: file-tree entries for the four .cs files + the RumbleLogger row in the static-class table. Added the two real Engine/Common touchpad files (PrecisionTouchpadReader, TouchpadOverlayDevice) that were missing from the tree. - Settings-and-Serialization.md: UserDevice.InputUpdates and UserDevice.DeviceEffects rows. - Input-Pipeline.md, SDL3-Integration.md: the step-(e) buffered- update code samples rewrote into the current per-(slot, device, padIdx) gesture-engine tick — that's what actually runs after the InputState swap in Step 2 today.

    @hifihedgehog hifihedgehog committed May 25, 2026
  • VirtualControllerType enum identifier is Xbox (not Microsoft — that's only the XmlEnum on-disk back-compat name)

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: MappingRow CombineExpression description, semicolon pseudo-period

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: name the Rumble-action VM fields explicitly; drop semicolon pseudo-period

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: fix table-cell '|. |' default-cell typos; extend MacroData / ActionData tables with v3.1+ lightbar and v3.2 trigger fields

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Strip em-dash pseudo-colons and pseudo-period semicolons across wiki prose

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: GlobalMacroData XmlArrayItem name is 'Index', not 'Btn' The LegacyTriggerRawButtons attribute was documented as [XmlArrayItem("Btn")] in the wiki but the actual class uses [XmlArrayItem("Index")] (SettingsService.cs:3892). Anyone copying the wiki snippet into a hand-crafted PadForge.xml would get the wrong element name and the array wouldn't round-trip. Fixed to match the live attribute.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: Source files list adds v3.2 schema files The 'Source files' bullet list at the top of the page covered only the v2-era schema files (PadSetting / UserDevice / UserSetting plus SettingsService / SettingsManager). v3.2 added the MappingSet family (MappingSet.cs + MappingRow.cs + MappingSource.cs + ShiftActivator.cs) and the DeviceTuning placeholder. Without those in the list, dev readers can't find the multi-source / shift-layer schema sources from the top of the page. Added both bullets.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: ExtendedSlotConfigData includes ForceFeedbackEnabled The DTO snippet was missing the ForceFeedbackEnabled XmlAttribute (default true) added in v3.0.3. Without it the docs implied v3 had no per-slot toggle for the HID PID FFB descriptor block, but the Extended config bar exposes that switch and Step 5 reads the value through ExtendedSlotConfigData on every Customize-aware rebuild.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: SwitchProfileMode includes ToggleVCsDisabled (v3.2) The enum block listed four values (Specific / Next / Previous / ToggleWindow) but the actual enum has a fifth, ToggleVCsDisabled, added in v3.2 to support the bulk virtual-controller on/off shortcut (see release notes 'Profiles and shortcuts'). Added the value and explained its bulk-flip + flyout behavior so the dev reference matches the user-facing Profiles.md description.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: MacroData + ActionData match current shape MacroData was missing three v3.2 trigger fields: - TriggerInputs (pipe-sep multi-device trigger combo) - TriggerExpression (Custom Expression formula text) - TriggerExpressionVariables (a/b/c/... variable bindings) ActionData was missing ten v3.1+ Lightbar override fields: - LightbarR / G / B - LightbarHoldMode (Reactive / Sticky) - LightbarColorSource (Fixed / RandomHue / PaletteStep) - LightbarHoldMs / LightbarFadeMs (Reactive timing window) - LightbarPaletteCsv (per-action palette) - LightbarTargetMode (LightbarModeSet target) - LightbarCycleModesCsv (LightbarModeCycle mode list) Also updated the MacroActionType list to cover the v3.1+ Lightbar action types (LightbarColor / LightbarColorClear / LightbarModeSet / LightbarModeCycle), the v3.1+ Rumble / RumbleStop pair, and v3.2's ToggleTouchpadOverlay action. Noted that the Rumble action's strength/hold/fade fields live on the MacroAction VM and don't yet round-trip through the serialized ActionData DTO.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: SettingsFileData + AppSettingsData match current code SettingsFileData class skeleton was missing two top-level arrays that have been on it since v3.2: - SlotMappingSets (multi-source / shift-layer mapping tables) - DeviceTunings (per-device tuning placeholder) AppSettingsData property reference table was missing ~16 fields covering v3.0-3.2 additions: v3.0: HmInactivityDestroyTimeoutSeconds, SlotProfileIds, LegacyDriverCleanupOffered v3.1: XboxSlotOrder + the four other per-group SlotOrder arrays, PlayStationConfigs v3.2: EnableTouchpadOverlay + 6 overlay position/size fields, UserProfiles (HMDeviceExtractor imports), GlobalMacros plus MainWindow Left/Top/Width/Height/State/FullScreen, KeepHidHideCloaksBetweenLaunches Also corrected SlotControllerTypes value 0 from 'Microsoft' to 'Xbox' (the C# enum name; the v2 XmlEnum 'Microsoft' alias is for on-disk back-compat only).

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: ProfileData property reference table matches class The class skeleton was updated last commit but the property reference table below it still listed only the v2 fields. Added rows for the v3.0-3.2 additions: v3.0: SlotProfileIds v3.1: PlayStationConfigs, all five SlotOrder arrays v3.2: SlotMappingSets, EnableTouchpadOverlay + 6 overlay position / size / opacity / monitor fields Tagged each addition with the version it landed in. Called out the v2-back-compat 'ProfileMicrosoftSlotOrder' XML name for the Xbox slot-order array since the C# property is XboxSlotOrder.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: ProfileData class block adds v3.0-3.2 fields The class skeleton was the v2 shape. Added 11 missing fields that have landed on ProfileData since v3.0: v3.0: - SlotProfileIds (per-slot HM profile slug) v3.1: - PlayStationConfigs (per-slot Adaptive Triggers + Lighting) - XboxSlotOrder / PlayStationSlotOrder / ExtendedSlotOrder / KeyboardMouseSlotOrder / MidiSlotOrder (per-group visual order) v3.2: - SlotMappingSets (per-VC multi-source / shift-layer tables) - EnableTouchpadOverlay + TouchpadOverlayOpacity / Monitor / Left / Top / Width / Height (the touchpad-overlay window's per-profile state) Grouped fields with category comments so it's clear what each one relates to and tagged the version on each addition.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: tighten ButtonShare-not-in-checksum claim Prior commit speculated about WHY ButtonShare is excluded (descriptor 'lives elsewhere'). I haven't traced that, and ButtonShare is in the MappingPropertyNames set at PadSetting.cs:1659. State the observable fact only: it's on the class but not appended to ComputeChecksum's StringBuilder. Could be an oversight or by design; the docs shouldn't guess.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: ComputeChecksum() field list covers v3.2 additions The ComputeChecksum() group enumeration listed 13 groups but the actual code hashes 19. Missing groups added (with explicit v3.2 tag where applicable): Touchpad (7 fields, contact + click descriptors) Impulse triggers (4 fields, v3.2) Constant trigger force (3 fields, v3.2) Audio bass trigger rumble (5 fields, v3.2) Constant force (3 fields) Gyro tuning (~24 fields, v3.2 — sensitivity / smoothing / space / bias / aim-engage / real-world calibration) Also noted that ButtonShare is on the class for Xbox Series mapping but is intentionally excluded from the checksum (its descriptor lives in the slot config, not in PadSetting).

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: LoadFrom* method list includes Web + Overlay UserDevice loading-methods section listed only LoadFromSdlDevice / LoadFromKeyboardDevice / LoadFromMouseDevice and claimed LoadFromSdlDevice 'sets DevRevision' (no such field exists; the method just delegates to LoadFromDevice). Added the missing LoadFromWebDevice (v3.x web-controller browser pads) and LoadFromOverlayDevice (v3.2 on-screen touchpad overlay) entry points and dropped the bogus DevRevision claim.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: UserDevice schema matches actual class Identity table dropped DevRevision (no such field in the class) and added the missing SdlGuid (used by gamecontrollerdb matching). Capability table dropped CapSubType (no such field) and CapFlags (no such field), and added the missing HasTouchpad and HasRumbleTriggers (driven by SDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE _BOOLEAN, used for the v3.2 impulse-trigger routing). HasGyro device list expanded to include the v3.2 additions (Switch 2 Pro, Steam Controller / Deck).

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: ShiftActivator schema matches actual class Field names matched the v3 design doc, not what shipped: <Input> (MappingSource) -> DeviceGuid + Descriptor (two strings) <ChordSecondInput> (MappingSource) -> ChordSecondDeviceGuid + ChordSecondDescriptor (two strings) <EmojiIcon> -> Icon <CycleLayerList> -> CycleLayers <CustomTargetLayer> -> JumpToLayer Restructured the table to show C# member name, type, default, and description, switched the column header to 'Member' since every field is an XmlAttribute (no <element> form), and called out the defaults explicitly so authors writing PadForge.xml by hand know what each attribute looks like when absent.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: MappingSource schema matches actual class The table mixed v3-design-doc names with actual code names and was missing ~half the fields. Replaced with the live shape: - Half -> HalfAxis (the actual XmlAttribute name) - Deadzone -> DeadZone (case) - InvertOnHoldModifier with type MappingSource -> ParamModifier (string descriptor; just one of several Param* attributes, not a nested MappingSource) - Added ParamUp / ParamDown / ParamRate / ParamSticky / ParamMin / ParamMax for the Incremental kind (previously listed only Rate / Sticky / Min / Max as one row, no Up/Down) - Added the v3.3 NoInherit reserved slot - Switched from <element> to attribute form throughout (every field is an XmlAttribute, no child elements) - Added defaults column

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: MappingRow schema matches actual class Field names were the v3-design-doc draft, not what shipped: <Output> -> Target ([XmlAttribute]) <Sources> -> Sources ([XmlElement("Source")]) — wraps List<MappingSource> <Combine> -> CombineMode ([XmlAttribute]); values are MaxAbs/Sum/ Average/OR/AND/XOR/Custom (not the UI labels) <Formula> -> CombineExpression ([XmlAttribute]) <LayerMask>, <NoInherit> exist but are XmlAttributes, not elements Restructured the table to show the C# member name, the actual XML serialization attribute, the type, and the description. Also added the mapping note that the seven internal CombineMode strings show up in the UI as Strongest / Combined / Average / Either / Both / Only one / Custom.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: MappingSet schema matches actual class shape The table for MappingSet element schema listed three children: <Layers> (MappingLayer[]) - does not exist <Activators> (ShiftActivator[]) - actual name is <ShiftActivator> <DefaultCombineModes> (dictionary) - does not exist anywhere The actual MappingSet class (PadForge.Engine/Data/MappingSet.cs) has two XmlElement-annotated lists: <Row> (Rows) and <ShiftActivator> (ShiftActivators). Rows are flat: every row across every layer is in the same list and tags itself with LayerMask. There's no MappingLayer wrapper and no DefaultCombineModes; the default-combine behavior is auto-mapping logic, not a persisted field. Rewrote the table and the layer-resolution explanation underneath.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Settings-and-Serialization: bump sample-xml dates 2025 -> 2026 Sample PadForge.xml block had DateCreated/DateUpdated stamps of '2025-01-15T10:30:00' for both the UserDevice and UserSetting examples. Bumped to 2026 so the example doesn't look year-stale to new readers.

    @hifihedgehog hifihedgehog committed May 21, 2026