Skip to content

History

Revisions

  • Web screenshots: full-window capture (DPI-aware)

    @hifihedgehog hifihedgehog committed May 4, 2026
    4faa438
  • Web screenshots: capture the actual Edge content window

    @hifihedgehog hifihedgehog committed May 4, 2026
    2d8aa07
  • Screenshots: full refresh on dev laptop (2560x1600 @ 150% DPI)

    @hifihedgehog hifihedgehog committed May 4, 2026
    ed5b9d0
  • 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.

    @hifihedgehog hifihedgehog committed May 4, 2026
    28e003d
  • Screenshots: refresh sticks/triggers dropdowns + 2D controller view Recaptured against the v3.1.0 layout: - pad-controller-2d.png - pad-sticks-deadzone-dropdown.png - pad-sticks-sensitivity-dropdown.png - pad-triggers-sensitivity-dropdown.png pad-playstation-configbar.png is still stale (April capture); it needs a PlayStation-type virtual controller present to refresh, and the current capture environment only has an Xbox-type slot.

    @hifihedgehog hifihedgehog committed May 4, 2026
    03bc934
  • v3.1.0: Adaptive Triggers + Lighting pages, refreshed screenshots New pages: - Adaptive-Triggers.md — seven trigger effect modes for slots with a DualSense assigned (Off, Feedback, Weapon, Vibration, Multi-Position Feedback, Slope, Multi-Position Vibration), the live effect-profile preview shape per mode, parameter semantics, and the wire-format crosswalk to the firmware's 0x01 / 0x02 / 0x06 / 0x21 / 0x26 trigger opcodes. - Lighting.md — thirteen lightbar modes for slots with a DS4 / DualSense / DualSense Edge assigned (Static, Breathing, Rainbow, palette-based Color Cycle, three Audio Pulse variants, three Audio Bands variants, two Input Reactive variants), audio sensitivity / thresholds / crossfade width, palette controls, pulse decay slider, and the Indicator LEDs card. Home.md — added a v3.1.0 callout summarizing the AT and Lighting tabs, the theme-aware icons, and the localization sweep across nine languages. Added new Tuning rows for [[Adaptive Triggers]] and [[Lighting]]. Trigger-Deadzones.md — Related Pages now links to [[Adaptive Triggers]] since they share the same physical triggers. capture.ps1 / convert-screenshots.ps1 — capture pipeline learns the new Adaptive Triggers and Lighting tabs (PlayStation slot only) and the PNG → JPG converter maps them into adaptive-triggers.jpg / lighting.jpg for both PadForge/screenshots and padforge.org/assets. images/ — refreshed all 16 screenshots from a v3.1.0 build with a DualSense assigned to a virtual slot so the AT/Lighting tabs are visible. Theme-aware icon changes are now reflected on the sticks / triggers / extended-schematic captures.

    @hifihedgehog hifihedgehog committed May 4, 2026
    e74a86e
  • HM bump: 1.2.0 -> 1.2.1; add PXN to gamepad-vendor list

    @hifihedgehog hifihedgehog committed Apr 28, 2026
    f0f982a
  • ApplyProfile: document SlotProfileIds apply + single-pass MapTo transition

    @hifihedgehog hifihedgehog committed Apr 28, 2026
    cdf0e83
  • VC type wiki: drop 'on-disk name' framing; XmlEnum is back-compat exception, not parallel name

    @hifihedgehog hifihedgehog committed Apr 28, 2026
    e93599b
  • Inactivity timeout: clarify slot config is preserved (VC torn down only)

    @hifihedgehog hifihedgehog committed Apr 28, 2026
    a5e0b50
  • Wiki refresh: VC reorder model (visual-position kernel-slot anchor) Reorder behavior just changed: same-profile reorders are pointer-only (no kernel teardown, no game disconnection); different-profile reorders destroy and recreate only the specific positions whose profile changed; matching positions in the same reorder still pointer-swap. Wiki refreshed to reflect this. User-facing: - Controller-Slots: rewrote "What rebuilds on reorder" with the visual-position-as-kernel-anchor model, three-bullet behavior breakdown (same-profile pointer swap, different-profile selective rebuild, disabled/awaiting invisible to kernel), and the data- identity vs kernel-slot-anchor rule. - Dashboard: tightened drag-reorder paragraph to one sentence on the pointer-swap behavior with link to Controller-Slots. Dev-facing: - Services-Layer: rewrote the Slot Reordering subsection with the five-rule spec (data identity / kernel-slot anchor / repoint-not- rebuild / same-profile zero-flicker / different-profile destroy+ recreate), per-pad vs per-VC state split, RebuildKernelOrderAfterReorder as a thin delegator, and a new RerouteVirtualControllersForReorder subsection covering the three-step implementation. Dropped v2 prose about "lowest changed position". - Input-Pipeline: cross-reference the intra-group reroute path (pointer move + same-profile reuse) vs cross-group / type-change destroy+recreate. - HIDMaestro-Deep-Dive: distinguish bubble-up cascade (deletion / inactivity-timeout) from intra-group reroute (no cascade). - Architecture-Overview: one short paragraph in Slot System covering the model + cross-reference to Services-Layer. - Virtual-Controllers: two inline corrections naming RerouteVirtualControllersForReorder (intra-group) alongside SwapSlotData (cross-group). Page-level rewrite still pending per the existing editor's note.

    @hifihedgehog hifihedgehog committed Apr 28, 2026
    cc81888
  • 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.

    @hifihedgehog hifihedgehog committed Apr 28, 2026
    875a0fa
  • Deep v3 resync: vJoy purge, Microsoft→Xbox terminology, current features Sweep residual v2 vJoy / ViGEmBus content out of user-facing pages and replace stale dev-page class names with the v3 unified HIDMaestro pipeline. Restore correct family-name terminology (Xbox / PlayStation / Extended, not Microsoft / Sony — those enum identifiers exist purely for v2 PadForge.xml back-compat per the in-source enum comment). User-facing pages (Home, Dashboard, Controller-Slots, Devices, Settings, Driver-Management, Troubleshooting, Force-Feedback, Web-Controller, 3D-and-2D-Visualization, 2D-Overlay-System, Installation, Stick-Deadzones, Trigger-Deadzones, Input-Precision): - vJoy slot type, "vJoy driver limit", and vJoy install steps removed - Troubleshooting: "vJoy Phantom Controllers" section deleted (v2 N²-bug, doesn't exist in HIDMaestro), other vJoy sections rewritten for HM - Force-Feedback: HID PID 1.0 framing for Extended; new Sony Report 0x01 rumble passthrough section - 3D-and-2D-Visualization: PlayStation touchpad preview (live finger spheres) and click-to-map TouchpadClick documented - 2D-Overlay-System: touchpad highlight visual spec (sampled colors) - Web-Controller: DS4 layout button-11 collapse for TouchpadClick Dev pages (Architecture-Overview, Engine-Library, Build-and-Publish, HIDMaestro-Deep-Dive, Input-Pipeline, SDL3-Integration, Services-Layer, Settings-and-Serialization, Driver-Installation-Internals, ViewModels, XAML-Views, Virtual-Controllers, Button-and-Axis-Mappings): - Stale Xbox360VirtualController / DS4VirtualController / ExtendedVirtualController / VJoyRawState references replaced with the v3 unified HMaestroVirtualController + ExtendedRawState - Step 5 prose updated to HMContext.SubmitState / SubmitRawReport with Sony Report 0x01 passthrough - HIDMaestro-Deep-Dive: HM 1.1.x → 1.2.0 - Services-Layer: false claim that Extended slots reset to "Microsoft (Xbox 360) gamepad preset" replaced with the actual behavior (ProfileId = GetDefaultProfileId(type), Custom "PadForge Game Controller" for Extended) - Three broken [[vJoy Deep Dive]] links retargeted to [[HIDMaestro Deep Dive]] - Virtual-Controllers gets a top-of-page editor's note flagging it for a full hand-rewrite (the deep sections still describe deleted v2 classes) Microsoft references kept where they are real: NuGet package Microsoft.Windows.Devices.Midi2, registry paths under SOFTWARE\Microsoft\, ".NET runtime download from Microsoft", literal VirtualControllerType.Microsoft enum-value citations, MaxXbox360Slots constant name (preserved from v2), [XmlEnum("Sony")] attribute string, OpenXInput Microsoft-trademark disclaimer.

    @hifihedgehog hifihedgehog committed Apr 27, 2026
    63b7bda
  • Force-Feedback: replace residual DirectInput framing with Extended (HID PID)

    @hifihedgehog hifihedgehog committed Apr 27, 2026
    c3748e3
  • Driver-Installation-Internals: correct UAC story PadForge requires elevation unconditionally via app.manifest (requestedExecutionLevel=requireAdministrator). Windows shows the UAC shield on the icon and prompts once at launch. The previous v2-era 'auto-elevates when vJoy is installed' / 'one UAC prompt per driver install' framing is wrong — every driver install/uninstall runs inside the already-elevated process, so no further prompts. Fixed: - Architecture mermaid: removed the four 'UAC Prompt' nodes; replaced with a single 'PadForge process (already elevated via app.manifest)' sink and a paragraph explaining the launch-time UAC. - HIDMaestro install / vJoy install / vJoy uninstall flowchart annotations: '(UAC elevation via runas)' / '(UAC prompt)' replaced with 'inherits elevation from PadForge'. - RunElevated description: clarifies the child does NOT prompt for UAC because the parent is already elevated. - Elevation Strategy table: rewritten — 1 UAC prompt at launch, 0 for every install/uninstall, vJoy rows removed. - CreateExtendedDevices comparison row: now says 'inherits PadForge's elevation' instead of describing two separate UAC behaviors.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    1a5236f
  • Recapture dropdown screenshots without Touchpad overlay The deadzone-shape, stick-sensitivity, and trigger-sensitivity dropdown captures still had the Touchpad overlay window blended in from a March-era pass that ran before the targeted-hide fix landed.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    2d5135a
  • Input-Precision: Extended triggers are now 16-bit PadForge's Extended profile builder now passes bits=16 to HIDMaestro's AddTrigger in both call sites (BuildCustomProfile + Step5 layout-override builder). 65536 trigger positions instead of 256. Page text updated to reflect this: trigger row in the Extended-slot table matches the stick row, and the summary table 'Trigger axis resolution' reads 65536. Constraint note clarified — HIDMaestro requires axis bit depths to be a multiple of 8, so the only valid alternative is 8-bit.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    ce9c98d
  • Input-Precision: reframe around custom HIDMaestro controllers The page is most useful to users building custom controllers via Extended slots — flight sticks, HOTAS, racing wheels, peripherals with non-standard axis/button layouts. Lead with the standard data characteristics that HMProfileBuilder gives you (16-bit unsigned sticks, 8-bit triggers raisable to 16-bit, 128 buttons, 8-way continuous POV, etc.) and treat the Microsoft (Xbox 360) and PlayStation (DS4) virtual-controller types as protocol-constrained alternatives. Stage 5 reordered: Extended first, with the inline note that 16-bit sticks exceed every consumer ADC's effective resolution. Microsoft and PlayStation follow as 'here's what each protocol limits you to'. Summary table renamed and re-keyed to lead with the Extended numbers. Intro rewritten to set expectations: this is the data-characteristics reference for users building custom controllers, organized as the input value's journey from SDL through deadzone math to HIDMaestro.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    f19f357
  • 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.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    389ae5c
  • Home: drop <picture>; GitHub Wiki Gollum strips <source> elements The dual prefers-color-scheme swap rendered as the light (black-silhouette) logo only on the dark wiki background, making the badge invisible. Use the white-silhouette variant directly so it shows up against the wiki's default dark theme. Light-theme readers get a faint badge instead of an invisible one.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    8bfb3f5
  • capture.ps1: only hide the Touchpad overlay, not every PadForge window Previous version blanket-hid every secondary PadForge-owned window via EnumWindows, then "restored" them with SW_SHOWNA at script end. Most of those were never visible to begin with (IME helpers, MediaContextNotificationWindow, .NET-BroadcastEventWindow, SystemResourceNotifyWindow, CiceroUIWndFrame). SW_SHOWNA on a never-visible window MAKES IT VISIBLE — so a normal capture run was leaving a handful of stray PadForge-owned windows floating around the desktop afterward. Fix: skip windows where IsWindowVisible returns false at scan time, and only target the title "PadForge Touchpad". That's the one window that actually intrudes on screenshots. Restore with SW_SHOW (5) instead of SW_SHOWNA (8) since we know it was visible before.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    a8f2207
  • 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.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    3716328
  • Refresh all screenshots from v3 PadForge with maximize-safe capture capture.ps1: ForceFG uses SW_SHOW (5) instead of SW_RESTORE (9) so the window stays maximized across Cap() calls. Adds Win32 EnumWindows hide of secondary PadForge windows (Touchpad overlay, IME) so they don't bleed into screenshots. Slot-type-specific captures find the Controller tab via AutomationId=TabController; slot indexes 3/4/5/6 match the PlayStation/Extended/KBM/MIDI ordering in the active config. Images now consistent at 2580x1620, 6 visible slots in sidebar, Macro 2 selected in pad-macros (action sequence visible), 2D toggle correctly fired in pad-controller-2d.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    ac269a5
  • Input-Pipeline diagram: Step 1/Step 5 cells reflect v3 (HM virtual filter substrings, HM thread-pool lifecycle, bubble-up cascade)

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    445851f
  • Driver-Installation-Internals: rewrite top sections for v3 (HM + HidHide + MIDI; vJoy gone, ViGEmBus gone) - Intro: 'four drivers/services' -> three (HIDMaestro, HidHide, Windows MIDI Services). vJoy and ViGEmBus are no longer install targets in v3. - Contents TOC: drop the vJoy Single-Node Architecture and vJoy Device Lifecycle sections; add Legacy v2 driver cleanup. - Architecture Mermaid diagram refreshed: HM via pnputil + HM SDK profile registration, HidHide via WiX bootstrapper, MIDI Services via GitHub API, legacy cleanup as a separate dashed branch. Adds a short note that OpenXInput is NOT managed by DriverInstaller — it's bundled inside the EXE as flat Content files. - Embedded Resources table reflects what's actually embedded in v3 (HIDMaestro driver bundle, HidHide EXE, OpenXInput DLLs as Content, Windows MIDI Services downloaded on demand). Deeper sections (vJoy device-node lifecycle, single-node architecture, SetupAPI mechanics) still describe v2 implementation and need a follow-up content rewrite or removal.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    e4764c8
  • Virtual-Controllers: rewrite Architecture Overview for v3 single-HMaestroVirtualController model Three v2 classes (Xbox360VirtualController, DS4VirtualController, ExtendedVirtualController) collapsed into one HMaestroVirtualController that takes the user-facing category and an HM profile at construction. The Mermaid diagram and Quick Comparison table now reflect that. Source file list shrunk to 3 implementations (HMaestro, KBM, MIDI). Lifecycle detail (thread pool, inactivity timeout, bubble-up cascade) is cross-referenced to HIDMaestro-Deep-Dive instead of duplicated here. Deeper per-class internal-mechanics sections of this page still describe v2 implementations and need a follow-up content rewrite.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    33b9258
  • 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.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    bbd82ef
  • capture.ps1: defensive Cap, dropdown-via-ExpandCollapsePattern, web Edge headless, slot-type captures - Cap() guards against zero/negative window dimensions (PadForge minimized or crashed mid-run no longer takes the whole script down). - Capture-DropdownByItemName helper: WPF Popup contents are UIA-opaque, but the parent ComboBox supports ExpandCollapsePattern. Iterate combos, Expand each, probe by item name (e.g. 'Scaled Radial' for deadzone shape), capture, Collapse. Adds dropdown captures for sticks-deadzone, sticks-sensitivity, triggers-sensitivity. - 2D toggle: revert to PadPageView+(26,62) DIPs * scale (was the working calibration before the ControllerModelHost detour). - Web controller captures via headless Edge (--headless --disable-gpu --screenshot=PATH --window-size=1280,720) when EnableWebController is true in PadForge.xml. Refresh of in-this-session captures (Microsoft slot only — 5-slot configuration was reset between runs).

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    2bfca0f
  • Refresh slot-type-specific screenshots (PlayStation, Extended, KBM, MIDI) + capture.ps1 ControllerModelHost lookup PadForge.xml on the capture machine now has all 5 slot types created (Microsoft, PlayStation, Extended, KBM, MIDI) so the per-slot navigation in capture.ps1 can land on each. Re-running capture refreshes: - pad-playstation-configbar.png - pad-extended-configbar.png - pad-kbm-preview.png - pad-midi-configbar.png capture.ps1 now uses ControllerModelHost AutomationId (added in PadPage.xaml on the app side) as the click anchor for ViewModeToggle. The 2D toggle still requires verification; falling back to the previous in-airspace pixel offset was unreliable.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    f879ad4
  • Controller-Slots: fix broken image refs (pad-vjoy-* deleted, point to pad-extended-configbar) The Extended controller's HID layout is shown as one combined view (HIDMaestro profile/customize bar + procedural sticks/triggers/buttons schematic), so we no longer need a separate -schematic image. Both old refs collapse into one.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
    e6c944d