-
Notifications
You must be signed in to change notification settings - Fork 6
Devices
The Devices page lists every physical input device PadForge has detected. Select a device to inspect its identity, view live raw input, assign it to virtual controller slots, or configure input hiding and raw mode.

| Area | Contents |
|---|---|
| Left panel | Device card list — one card per detected device |
| Right panel | Detail/inspection pane for the selected device: identity, slot assignment toggles, hiding options, live raw input |
| Page header | Refresh button (forces re-scan), Online count, Total count (includes disconnected devices) |
Each device appears as a rounded card, sorted alphabetically by name then by VID:PID.
Top row:
| Element | Description |
|---|---|
| Status dot | Green = connected; Gray = previously seen, currently disconnected |
| Device name | Hardware-reported name (e.g., "Xbox Wireless Controller"). Merged devices show "All Keyboards (Merged)" or "All Mice (Merged)". |
| Slot badges | Numbered badges indicating assigned virtual controller slots, or a dim "Unassigned" label |
| Remove button | X button — permanently deletes the device record and all its settings |
Bottom row:
| Element | Description |
|---|---|
| Type | Device category: Gamepad, Joystick, Wheel, Flight Stick, Mouse, Keyboard, etc. |
| VID:PID | USB Vendor and Product ID in hex (e.g., "054C:0CE6" for DualSense) |
| Capabilities | Axis, button, and POV hat counts, plus feature labels (Rumble, Gyro, Accel) |
Click a card to select it. The selected card shows a vertical accent-colored bar on its left edge and populates the detail pane.
The X button permanently removes the device and all associated settings (mappings, slot assignments, hiding preferences). The virtual controller slot itself remains — it simply becomes unassigned.
If the device is still physically connected, it reappears on the next scan as a fresh device with no prior settings.
| Field | Description |
|---|---|
| Device name | Large heading |
| Product | Product name string from hardware |
| Type | Device category |
| Capabilities | Axis/button/POV counts and feature labels |
| GUID | Deterministic instance GUID built from device path, VID/PID, and serial number. Marquee scrolling if long. |
| Instance Path | HID path used for HidHide blacklisting. Shown only for devices with a resolvable HID path (not merged keyboard/mouse entries). Marquee scrolling if long. |
| VID:PID | Vendor and Product ID in hex |
Appears for joystick-class devices (flight sticks, wheels, non-gamepad controllers). Opens a pre-filled GitHub issue to contribute a community controller mapping. Hidden for gamepads, keyboards, and mice.
The Virtual Controller Assignment section shows numbered toggle buttons — one per existing virtual controller slot.
- Highlighted = assigned to that slot
- Normal = not assigned
- Multiple toggles can be active simultaneously (see Multi-Slot Assignment)
Assigning a device creates a default mapping if none exists and navigates to the controller configuration page.
Drag a device card from the left panel onto a sidebar slot card. This assigns the device, identical to clicking the toggle button.
- The slot's virtual controller is created automatically if it does not exist
- A default button/axis mapping is generated based on device type and output type (Xbox 360, DS4, vJoy, etc.)
- For gamepads and joysticks, "Hide from games" is auto-enabled if HidHide is installed
- Slot badges on the device card update immediately
Unassigning a device from all slots automatically clears both hiding options.
A single physical device can feed multiple virtual controller slots simultaneously. Use cases:
- Dual output types — one controller feeding both Xbox 360 (for a game) and vJoy (for a flight sim overlay) at once
- Split button subsets — left side mapped to one virtual controller, right side to another
- Comparing configurations — test different dead zone, sensitivity, or macro setups without swapping devices
- MIDI + gamepad — simultaneous game input and MIDI control signals
Toggle on multiple slot buttons in the detail pane. Each slot maintains its own independent mapping — the same physical input can be mapped differently per slot.
Slot badges show all assigned slot numbers at a glance. Badge numbers are sequential (1, 2, 3...) based on slot creation order.
The bottom section of the detail pane shows live, unprocessed hardware data — before any mappings, dead zones, or sensitivity curves. Updates at the engine's polling rate.
Each axis displays:
| Element | Description |
|---|---|
| Name | Gamepad mode: LX, LY, LT, RX, RY, RT. Raw mode: Axis 0, Axis 1, etc. |
| Progress bar | Horizontal bar normalized to 0–1 range. Centered stick reads ~50%. |
| Raw value | Exact integer (0–65535) in monospace font |
What to watch for:
- Center drift — axis does not rest at ~32768 when untouched. Use Calibrate Center on the Sticks tab.
- Trigger baseline — some triggers rest at 0, others at 32768, depending on hardware and input mode.
- Dead axes — axis never moves. The mapping database may have an error. Try Force Raw Joystick Mode.
Small circles in a flowing wrap layout, labeled by index (0, 1, 2...).
| State | Appearance |
|---|---|
| Released | Dim gray circle |
| Pressed | Filled with system accent color |
Gamepad mode shows 11 standard buttons (A, B, X, Y, LB, RB, Back, Start, LS, RS, Guide — indices 0–10). Raw mode shows all physical buttons (e.g., 13 or 17 on some controllers).
A visual QWERTY keyboard layout replaces axes and buttons — main keyboard, navigation cluster, arrow keys, and numpad. Keys light up with the accent color in real time.
A visual mouse graphic replaces axes and buttons, showing:
- Button presses highlighted on the mouse body
- Motion direction indicated visually
- Scroll wheel activity as scroll intensity
Compass widgets — small circles with a directional indicator line, labeled "POV 0", "POV 1", etc.
| State | Appearance |
|---|---|
| Centered | Background circle with center dot, no line |
| Direction pressed | Accent-colored line from center toward pressed direction |
Supports all 8 directions: N, NE, E, SE, S, SW, W, NW. Some specialty controllers report continuous angular values.
Appears for devices with a gyro sensor (DualSense, DualShock 4, Switch Pro Controller, etc.). Shows real-time rotational velocity:
| Axis | Motion |
|---|---|
| X | Pitch (forward/backward tilt) |
| Y | Yaw (left/right rotation) |
| Z | Roll (side-to-side tilt) |
Values display with three decimal places. Stationary controller reads near 0.000.
Appears for devices with an accelerometer sensor. Shows linear acceleration:
| Axis | Motion |
|---|---|
| X | Left/right |
| Y | Up/down (includes gravity — ~1.0 or -1.0 when stationary) |
| Z | Forward/backward |
When a physical device is assigned to a virtual controller slot, games may detect both devices — causing double input. PadForge provides two prevention mechanisms, configurable per device.
Uses the HidHide kernel-mode driver to hide the physical device at the OS level. Games cannot see it at all. PadForge is whitelisted automatically.
| Best for | Gamepads, joysticks, wheels, flight sticks |
| Requires | HidHide driver installed. Grayed out otherwise. Install via Driver Management in Settings. |
| Scope | Entire device hidden from all non-whitelisted applications |
| Takes effect | Immediately. Persists across restarts. |
Additional applications can be whitelisted in Settings to see hidden devices (e.g., streaming overlays, secondary remappers).
Suppresses only the specific keys or mouse buttons actively mapped to a virtual controller output. Unmapped inputs pass through normally.
| Best for | Keyboards and mice — suppress mapped keys only, typing and mouse movement unaffected |
| Requires | Nothing — uses Windows low-level input hooks |
| Scope | Only mapped keys/buttons suppressed |
| Visibility | Shown only for keyboard and mouse devices |
| Scenario | Method |
|---|---|
| Xbox/PlayStation/Switch controller on a slot | Hide from Games (HidHide) |
| Racing wheel or flight stick on a slot | Hide from Games (HidHide) |
| Keyboard with a few keys mapped to gamepad buttons | Consume Mapped Inputs |
| Mouse with side buttons mapped to gamepad buttons | Consume Mapped Inputs |
| Hide a keyboard entirely from all apps | Hide from Games (HidHide) — see safety warnings |
| Device Type | Hide from Games | Consume Mapped Inputs |
|---|---|---|
| Gamepad / Joystick / Wheel / Flight Stick | Auto-enabled (if HidHide installed) | Not shown |
| Keyboard | Not enabled | Not enabled |
| Mouse | Not enabled | Not enabled |
Keyboards and mice intentionally do not auto-enable any hiding — accidental blocking makes the computer difficult to control.
Unassigning a device from all slots automatically clears both hiding options.
PadForge shows a confirmation flyout when hiding is manually enabled on a keyboard or mouse:
- HidHide on keyboard — the entire keyboard is hidden from all applications. On "All Keyboards (Merged)", this affects every connected keyboard.
- HidHide on mouse — mouse control is lost in all apps outside PadForge. On "All Mice (Merged)", this affects every connected mouse.
- Consume on keyboard — mapped keys stop working in other applications while PadForge runs.
- Consume on mouse — mapped buttons (potentially left/right click) are suppressed.
Click Cancel to revert or Proceed to confirm.
The global "Hide devices from games" toggle in Settings (under Input Engine) acts as a master on/off. When OFF, no hiding or suppression occurs regardless of per-device settings. Turning it back ON restores all per-device settings. A quick way to temporarily disable all hiding.
By default, PadForge uses SDL3's gamepad remapping layer for recognized gamepads — translating raw button/axis indices into a standard layout (A/B/X/Y, LX/LY, LT/RT) based on a built-in controller database.
Force Raw Joystick Mode bypasses this remapping and reads raw hardware indices directly — the same values shown in Windows Game Controllers (joy.cpl).
| Symptom | Explanation |
|---|---|
| Buttons mapped to wrong outputs | SDL3's mapping does not match the device |
| Some buttons produce no input | SDL3 consumes physical buttons and maps them to slots that do not match |
| Extra buttons missing | Controllers with more than 11 buttons lose extras in gamepad mode |
| Works in joy.cpl but not PadForge | SDL3 mapping is the problem |
| Third-party or niche gamepads | Budget controllers, retro adapters, arcade sticks more likely to have incorrect entries |
| DsHidMini SDF mode | DualShock 3 via SDF requires raw mode — SDL3 drops some buttons |
- Select the device card
- In the detail pane, find the Input Mode section (gamepad-type devices only)
- Check Force raw joystick mode
- Saved immediately, persists across restarts
- Axis names: LX, LY, LT... become Axis 0, Axis 1, Axis 2... (matching joy.cpl)
- Button names: A, B, X, Y... become Button 0, Button 1, Button 2...
- Button count may increase — raw mode exposes all physical buttons
- Auto-mapping is unavailable — record each mapping manually via the Record button
- Raw input display updates immediately
If the controller works correctly in gamepad mode, raw mode offers no benefit. Gamepad mode provides friendly names and automatic default mappings.
The toggle only appears for devices SDL3 recognizes as gamepads. Devices already operating as raw joysticks (flight sticks, wheels, generic HID) always read raw indices.
PadForge identifies devices using deterministic GUIDs for reliable recognition across reboots, re-plugs, and USB port changes.
| Priority | Source | Stability |
|---|---|---|
| 1 | Serial number (e.g., Bluetooth MAC address) | Stable across reboots, re-pairing, and port changes |
| 2 | Device path | Stable for the same USB port; changes if port changes |
| 3 | SDL instance ID + VID/PID | May change on every reconnection |
- Bluetooth controllers (DualSense, DualShock 4, Switch Pro) — GUID stays the same across reboots and re-pairs. All settings persist automatically.
- Wired USB controllers — GUID stays the same for the same USB port. Different port generates a new GUID; old settings remain on the offline (gray) device card.
- Profile switching — uses a ProductGuid fallback. If a profile was saved with a device that now has a different InstanceGuid (e.g., port change), PadForge matches by VID/PID so the profile still applies.
Disconnected devices remain in the list with a gray dot:
- All mappings, slot assignments, and settings are preserved
- Reconnecting with the same GUID restores everything automatically
- Remove with the X button if no longer needed
- Offline cards consume no resources — stored settings only
Compensates for natural center drift — a stick resting slightly off-center when untouched.
- Go to the Sticks tab on the controller's configuration page
- Click Calibrate Center while the stick is at rest (do not touch it)
- PadForge samples hardware values for approximately half a second and calculates the offset
The offset is applied before dead zone processing, keeping the dead zone circle centered on the actual rest position.
Controls the maximum physical travel (0–100%) that maps to full output. If the stick cannot physically reach the corners, reducing max range ensures 100% output is still achievable within the stick's actual travel.
- Click Refresh to force a re-scan
- Verify the device appears in Windows Device Manager or joy.cpl
- For Bluetooth controllers, confirm pairing in Windows Bluetooth settings
- PadForge filters out its own virtual controllers (ViGEm, vJoy) automatically
- Some devices require manufacturer-specific drivers
- Check the raw input state section — are axes, buttons, and POVs displayed?
- If they appear but never change, try enabling Force Raw Joystick Mode
- For Bluetooth devices, verify a stable connection (green status dot)
- Enable Force Raw Joystick Mode to bypass SDL3's potentially incorrect mapping
- Compare PadForge's raw input display with joy.cpl
- For unmapped joystick-type devices, click Submit Mapping to contribute a community mapping
- Enable Hide from Games (HidHide) on the device, or Consume Mapped Inputs for keyboard/mouse
- Verify the master "Hide devices from games" toggle in Settings is ON
- Confirm HidHide is installed via Driver Management
- Wired controller plugged into a different USB port may have received a new GUID. Old settings remain on the offline (gray) card. Plug back into the original port, or reconfigure on the new card.
- Bluetooth controllers retain their GUID via MAC address — settings persist automatically.
- Ensure the stick was completely at rest during calibration
- For severe drift, the analog stick may be physically worn. Increasing dead zone size on the Sticks tab can compensate.
- HidHide driver is not installed. Go to Settings > Driver Management to install it.
- Restart PadForge after installing HidHide.
- Controller Slots — Create slots before assigning devices
- Button and Axis Mappings — Map inputs after assigning a device
- Dashboard — Connected device counts at a glance
- Driver Management — HidHide driver installation
- Troubleshooting — General troubleshooting guide
- Web Controller — Use any touchscreen device as a virtual controller via the browser