-
Notifications
You must be signed in to change notification settings - Fork 6
Devices
Every gamepad, joystick, keyboard, mouse, and touchpad PadForge can see lives on this page as a card.

| Area | What it holds |
|---|---|
| Left panel | One card for each detected device |
| Right panel | Detail pane for the selected device. Identity, slot assignment, hiding, live raw input. |
| Header | Refresh button, Online count, Total count (includes disconnected) |
Cards sort alphabetically by name, then by VID:PID.
Top row:
| Element | Description |
|---|---|
| Status dot | Green for connected, gray for disconnected |
| Device name | The name the hardware reports (e.g., "Xbox Wireless Controller"). Merged devices show "All Keyboards (Merged)" or "All Mice (Merged)". |
| Slot badges | Slot numbers the device is assigned to. A dim "Unassigned" label appears if none. |
| Remove button | X. Deletes the device and its settings. |
Bottom row:
| Element | Description |
|---|---|
| Type | Gamepad, Joystick, Wheel, Flight Stick, Mouse, Keyboard, etc. |
| VID:PID | USB Vendor and Product ID in hex (054C:0CE6 for DualSense) |
| Capabilities | Axis, button, and POV hat counts plus feature tags (Rumble, Gyro, Accel) |
Click a card. A vertical accent bar appears on the left edge. The detail pane fills in.
The X button deletes the device and all its settings (mappings, slot assignments, hiding). The slot stays. It just becomes unassigned.
If the device is still plugged in, it comes back on the next scan as a fresh device with no settings.
| Field | Description |
|---|---|
| Device name | Large heading |
| Product | Product name from hardware |
| Type | Device category |
| Capabilities | Axis / button / POV counts and feature tags |
| GUID | Instance GUID built from device path, VID:PID, and serial number. Marquee-scrolls if long. |
| Instance Path | HID path used for HidHide blacklisting. Shown only for devices that report a resolvable HID path. Marquee-scrolls if long. |
| VID:PID | Vendor and Product ID in hex |
Shows on the card for any joystick-class HID device PadForge does not already know as a standard gamepad. Hidden for known gamepads, keyboards, mice, and touchpads.
Click it. Your browser opens a GitHub issue pre-filled with every field PadForge can read from the device:
- Device name
- USB Vendor ID (hex)
- USB Product ID (hex)
- SDL GUID (the 32-character hex string SDL uses to look up mappings)
- Axis count
- Button count
- Hat / POV count
You fill in the per-input mapping by hand. Which raw axis index is Left Stick X. Which raw button index is A. Read those off the raw input section on this page while pressing each control.
Once the issue is merged, the mapping ships in gamecontrollerdb_padforge.txt and auto-loads on every PadForge install. Future users with the same hardware get the device recognized without further setup.
The blank Device Mapping issue template makes you type the device identification fields yourself. The in-app button reads them straight from PadForge's live SDL3 enumeration, so the SDL GUID can't be mistyped. Use the button when the device is plugged in.
The Virtual Controller Assignment section in the detail pane shows numbered toggles, one per existing slot.
- Highlighted = assigned to that slot
- Normal = not assigned
- More than one toggle can be on at the same time (see Multi-slot below)
Assigning a device builds a default mapping if none exists, then opens the controller config page.
Drag a card from the left panel onto a sidebar slot card. Same result as clicking the toggle.
- The slot's virtual controller is created if it does not exist yet
- A default mapping is built for the device type and output type (Xbox, PlayStation, Extended, etc.)
- For gamepads and joysticks, "Hide from games" turns on if HidHide is installed
- Slot badges update right away
Unassigning a device from every slot clears both hiding options.
One physical device can feed more than one slot at the same time. Real uses:
- Two output types at once. One pad feeding an Xbox slot for the game and an Extended slot for a flight sim overlay.
- Split button subsets. Left side mapped to one slot, right side to another.
- A/B testing. Compare deadzone, sensitivity, or macro setups without swapping hardware.
- MIDI plus gamepad. Game input and MIDI signals from the same pad.
Toggle multiple slot buttons in the detail pane. Each slot keeps its own mapping, so the same physical input can mean different things on different slots.
Slot badges show every assigned slot number at a glance.
The bottom of the detail pane shows live hardware data before any mapping, deadzone, or sensitivity work. Updates at the engine polling rate.
Each axis row has:
| Element | Description |
|---|---|
| Name | Gamepad mode: LX, LY, LT, RX, RY, RT. Raw mode: Axis 0, Axis 1, etc. |
| Progress bar | Horizontal, 0-1 range. A centered stick reads ~50%. |
| Raw value | Exact integer (0-65535) in monospace |
Look for:
- Center drift. The axis does not rest at ~32768 when you let go. Use Calibrate Center on the Sticks tab.
- Trigger baseline. Some triggers rest at 0, others at 32768. Depends on hardware and input mode.
- Dead axes. Axis never moves. The mapping database may have a bad entry. Try Force Raw Joystick Mode.
Small circles in a wrap layout, labeled by index (0, 1, 2...).
| State | Look |
|---|---|
| Released | Dim gray |
| Pressed | Filled with the system accent color |
Gamepad mode shows 11 standard buttons (A, B, X, Y, LB, RB, Back, Start, LS, RS, Guide). Raw mode shows every physical button (13 or 17 on some controllers).
A QWERTY layout replaces axes and buttons. Main keys, navigation cluster, arrows, numpad. Keys light up in the accent color as you press them.
A mouse graphic replaces axes and buttons:
- Button presses highlight on the mouse body
- Motion direction shows visually
- Scroll wheel activity reads as scroll intensity
Compass widgets with a direction line, labeled "POV 0", "POV 1", etc.
| State | Look |
|---|---|
| Centered | Background circle with center dot, no line |
| Direction pressed | Accent line from center toward the pressed direction |
All 8 directions are supported (N, NE, E, SE, S, SW, W, NW). Some specialty controllers report continuous angular values.
Shows on devices with a gyro sensor (DualSense, DualShock 4, Switch Pro, others). Rotational velocity. Used by the DSU Motion Server for motion-enabled emulators.
| Axis | Motion |
|---|---|
| X | Pitch (forward / backward tilt) |
| Y | Yaw (left / right rotation) |
| Z | Roll (side-to-side tilt) |
Three decimal places. A still controller reads near 0.000.
Shows on devices with an accelerometer. Linear acceleration:
| Axis | Motion |
|---|---|
| X | Left / right |
| Y | Up / down (includes gravity, so ~1.0 or -1.0 when still) |
| Z | Forward / backward |
PadForge reads two kinds of touch surfaces on the Devices page.
- Gamepad touchpads. The touch surfaces on DualShock 4, DualSense, Steam Controller, and Steam Deck. SDL3 reports them as part of the gamepad. They show up in the raw input view with contact position and finger count.
-
Windows Precision Touchpad. Laptop trackpads and external precision touchpads. PadForge reads them through the precision-touchpad reader and treats each one as its own device card with live touch preview. PTP devices have no physical click button, so the
TouchpadClickdescriptor is omitted from their picker entries and auto-map.
A third and fourth source live elsewhere: Web Controller clients in touchpad-only or DS4-with-touchpad mode, and the on-screen Touchpad Overlay. All four feed the same per-slot configuration on the Touchpad tab.
When a physical device feeds a slot, games can see both devices and double up the input. PadForge offers two ways to stop that, set per device.
Hides the physical device at the OS level using HidHide. The whole device disappears from every non-whitelisted app the moment you toggle the option. PadForge is whitelisted automatically. The setting persists across restarts. Best for gamepads, joysticks, racing wheels, and flight sticks. The toggle is grayed out if HidHide is not installed. Install it from Driver Management.
You can whitelist more apps in Settings so they can still see hidden devices (streaming overlays, secondary remappers, etc.).
Suppresses only the specific keys or mouse buttons mapped to a virtual controller output. Unmapped keys still type. The cursor still moves. No driver needed. Windows low-level input hooks handle it. The toggle only shows for keyboards and mice.
| Situation | Method |
|---|---|
| Xbox / PlayStation / Switch controller | Hide from Games |
| Racing wheel or flight stick | Hide from Games |
| Keyboard with a few keys mapped | Consume Mapped Inputs |
| Mouse with side buttons mapped | Consume Mapped Inputs |
| Hide a keyboard entirely | Hide from Games (read the warnings) |
| Device type | Hide from Games | Consume Mapped Inputs |
|---|---|---|
| Gamepad / Joystick / Wheel / Flight Stick | Auto-enabled (if HidHide is installed) | Not shown |
| Keyboard | Off | Off |
| Mouse | Off | Off |
Keyboards and mice do not auto-enable any hiding. Blocking them by accident makes the PC hard to use.
Unassigning a device from every slot clears both hiding options.
PadForge shows a confirmation flyout when you turn on hiding for a keyboard or mouse:
- HidHide on keyboard. Every app loses keyboard access. "All Keyboards (Merged)" affects every connected keyboard.
- HidHide on mouse. Every app outside PadForge loses mouse control. "All Mice (Merged)" affects every connected mouse.
- Consume on keyboard. Mapped keys stop working in other apps while PadForge runs.
- Consume on mouse. Mapped buttons (possibly left / right click) are suppressed.
Click Cancel to back out or Proceed to confirm.
The global "Hide devices from games" toggle in Settings (under Input Engine) is the master on / off. With it off, no hiding or suppression runs, no matter what each device is set to. Flipping it back on restores every per-device setting.
By default, PadForge uses SDL3's gamepad layer for known gamepads. SDL3 translates raw button and axis indices into a standard layout (A/B/X/Y, LX/LY, LT/RT) via a built-in controller database.
Force Raw Joystick Mode skips that translation and reads raw hardware indices straight, the same values Windows Game Controllers (joy.cpl) shows.
| Symptom | Why |
|---|---|
| Buttons map to the wrong outputs | SDL3's mapping does not match the device |
| Some buttons read no input | SDL3 ate the button and sent it to a slot that does not match |
| Extra buttons go missing | Controllers with more than 11 buttons lose the extras in gamepad mode |
| Works in joy.cpl but not PadForge | SDL3 mapping is wrong |
| Off-brand or niche gamepads | Budget controllers, retro adapters, arcade sticks often have wrong database entries |
| DsHidMini SDF mode | DualShock 3 via SDF needs raw mode. SDL3 drops some buttons. |
- Select the device card
- In the detail pane, find the Input Mode section (gamepad-type devices only. The section is hidden for PadForge's own virtual controllers and other virtual input sources.)
- Check Force raw joystick mode
- Saved right away. Persists across restarts.
- Axis names: LX, LY, LT... become Axis 0, Axis 1, Axis 2... (same as joy.cpl)
- Button names: A, B, X, Y... become Button 0, Button 1, Button 2...
- Button count can rise. Raw mode exposes every physical button.
- Auto-mapping is off. Record each mapping by hand from the Record button.
- The raw input display updates right away
If the controller works fine in gamepad mode, raw mode gains you nothing. Gamepad mode gives you friendly names and a default mapping.
The toggle only shows for devices SDL3 recognizes as gamepads. Devices already running as raw joysticks (flight sticks, wheels, generic HID) always use raw indices.
PadForge identifies devices with deterministic GUIDs so they survive reboots, re-plugs, and 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 you switch ports. |
| 3 | SDL instance ID + VID:PID | Can change on every reconnect |
- Bluetooth controllers (DualSense, DualShock 4, Switch Pro). GUID stays the same across reboots and re-pairs. Settings stick.
- Wired USB controllers. GUID stays the same on the same USB port. A different port makes a new GUID. The old settings stay on the offline (gray) card.
- Profiles. Uses a ProductGuid fallback. If a profile was saved with a device that now has a different InstanceGuid (port change, for example), PadForge matches by VID:PID so the profile still applies.
Disconnected devices stay in the list with a gray dot.
- Every mapping, slot assignment, and setting is kept
- Reconnect with the same GUID and everything comes back
- Remove with the X button if you no longer need it
- Offline cards cost nothing at runtime. Stored settings only.
Fixes center drift: a stick that does not rest in the middle.
- Go to the Sticks tab on the controller's config page (see Stick Deadzones)
- Click Calibrate Center while the stick is at rest (do not touch it)
- PadForge samples hardware values for ~500 ms and calculates the offset
The offset is applied before deadzone processing, which keeps the deadzone circle centered on the real rest position.
Sets the maximum physical travel (0-100%) that maps to full output. If the stick cannot reach the corners, lower the max range so full output is reachable within the stick's actual travel.
- Click Refresh to re-scan
- Confirm the device shows up in Device Manager or joy.cpl
- For Bluetooth controllers, check pairing in Windows Bluetooth settings
- PadForge filters out its own Controller Slots (HIDMaestro outputs) on purpose
- Some devices need a manufacturer driver
- Check the raw input section. Are axes, buttons, and POVs drawn?
- If they show but never change, try Force Raw Joystick Mode
- For Bluetooth devices, confirm a stable connection (green status dot)
- Turn on Force Raw Joystick Mode to skip SDL3's mapping
- Compare PadForge's raw input view with joy.cpl
- For an unmapped joystick-type device, click Submit Mapping to contribute a mapping
- Turn on Hide from Games on the device, or Consume Mapped Inputs for keyboards and mice
- Confirm the master "Hide devices from games" toggle in Settings is on
- Confirm HidHide is installed via Driver Management
- A wired controller on a different USB port gets a new GUID. Old settings stay on the offline (gray) card. Plug back into the original port, or reconfigure on the new card.
- Bluetooth controllers keep their GUID via MAC address. Settings persist.
- Make sure the stick was completely at rest during calibration
- For bad drift, the stick may be worn out. Raise the deadzone on the Sticks tab to cover it.
- Grayed out: HidHide is not installed. Install via Driver Management and restart PadForge.
- Missing: the device is a virtual input source (PadForge's own virtual controllers, software keyboards, etc.). Hiding a virtual source has no meaning, so the toggle is left out instead of shown disabled.
- Controller Slots: create slots before assigning devices.
- Button and Axis Mappings: map inputs after assigning a device.
- Stick Deadzones: calibrate center offset and deadzones.
- Macros: automated actions triggered by device inputs.
- Force Feedback: device rumble and haptic capabilities.
- DSU Motion Server: Gyro and accel data for motion-enabled emulators.
- Profiles: device connections persist across profile switches.
- Dashboard: connected device counts at a glance.
- Settings: master device hiding toggle.
- Driver Management: HIDMaestro and HidHide driver installation.
- Troubleshooting: general troubleshooting guide.