-
Notifications
You must be signed in to change notification settings - Fork 6
Shift Layers
A second mapping table that turns on while an input is engaged. Think of it as Shift or Caps Lock for your controller.

A shift layer overlays or replaces your Base mappings while an activator is engaged. Hold a button to remap your face buttons to pit-menu commands. Toggle a switch to swap from menu controls to gameplay. Cycle through three layouts with one bumper.
Each slot has its own layers. Open a slot, open the Mappings tab, and click + Shift Layer.
Base layer. Always active. Every slot starts with one Base layer holding the rows you bind on the Mappings tab. A Configure Base flyout sets the Base tab's name, color, and icon.
Shift layer. A second (third, fourth) mapping table on the same slot. Active only while its activator is engaged.
LayerMask. Each mapping row carries a layer tag. Base rows are tagged Base. Shift rows are tagged with the layer's mask (PitStop, Shift1, etc.). You can have many rows for the same target across different layers.
InheritUnmapped (per layer). Off by default. The active shift layer replaces Base. Targets without a row on the active layer output zero. Turn it on and the layer overlays Base. Targets without a row fall through to Base.
NoInherit (per row). Forces a single target to stay off on this layer even when InheritUnmapped is on. Useful when you want one specific button silenced while the rest of the layer falls through.
- Open a slot. Open the Mappings tab.
- Click + Shift Layer.
- The Shift Layer dialog opens. Fill in the fields below.
- Click OK. A new tab appears in the layer strip above the mapping grid.
- Click the new tab and bind rows the same way you bind Base rows.
| Field | What it does |
|---|---|
| Layer Name | The label on the tab and the engaged-layer flyout (e.g. Pit Stop). |
| Activator Input | Cross-device picker with Record and Clear. The input that engages the layer. Can live on a different physical controller than the slot it shifts. Optional for Cycle and No Button, so you can wire a queue up incrementally. |
| Activator Kind | Button, Chord, or Axis. See the table below. |
| Mode | Hold, Toggle, Latch, Cycle, Sticky (one-shot), or No Button. See the table below. |
| Layer Color | Full color picker. Tints the tab and the flyout. Reset to clear. |
| Emoji Icon | Single grapheme shown on the flyout. Defaults to ⇧. |
| Delay (ms) | Debounce. Milliseconds the activator must hold before the layer change fires. 0 is instant. |
| Also Fire Activator's Own Mapping | Off by default. On lets the activator input drive its own row alongside the layer change. |
| Inherit Unmapped Targets From Base | Off by default. On = overlay with fallthrough. Off = replace. |
| Kind | Engages when |
|---|---|
| Button | One button (or POV direction) is pressed. Default. |
| Chord | Two inputs are held at once. The second input has its own device picker, so chords can cross devices (left bumper on the wheel plus button 1 on the H-pattern shifter). |
| Axis | An analog axis crosses the threshold. Default threshold is 0.5 of full deflection. Useful for clutch travel, paddle pulls, throttle past idle. |
| Mode | Behavior |
|---|---|
| Hold | Layer is active while the input is engaged. Release the input to drop back to Base. The keyboard-Shift model. |
| Toggle | Each press flips engagement. Press once to engage. Press again to release. The Caps-Lock model. |
| Latch | Press to latch this layer's own mappings on. Press again to return to Base. Pressing a different Latch button switches straight to that layer. Renamed from Custom. |
| Cycle | One control steps through a queue of layers. See Cycle queue for the Next and Previous buttons and the queue options. |
| Sticky (one-shot) | One press engages. The next input that fires on the engaged layer auto-releases the layer. Tap-then-tap muscle memory without holding. |
| No Button | A passive layer with no activator of its own. It owns a tab and its mappings but never self-engages. You reach it only by adding it to a Cycle queue. |
Toggle, Latch, Cycle, and Sticky engagement state does not persist across an app restart. Hold is stateless, so it survives by definition. A No Button layer has no engagement state of its own.
A Cycle activator holds a queue of layers and two buttons that walk it.
- Next Button. The activator's own input. Each press steps the shared cursor forward one layer.
- Previous Button. A second input that steps the same cursor backward. It can live on a different device.
- Cycle Through Layers. A checkbox list of which layers sit in the queue.
- Wrap Around. On by default. Step past the last layer and the cursor returns to the first.
- Include Base. Off by default. With it off, the cycle walks the checked layers only, and Base is the resting state. Turn it on to fold Base into the queue.
Next and Previous drive one shared cursor, so they read as forward and backward through the same queue.
A horizontal strip sits above the mapping grid on the Mappings tab. Base is always the leftmost tab. Shift layers fill the rest in creation order. The strip wraps to a second row when there are more layers than fit.
Each tab carries the layer's color. The active tab is the layer you're editing, not the layer currently engaged on the controller.
Right-click a tab for per-layer operations:
- Configure activator… Reopens the dialog above.
- Rename layer… Edits the display name without breaking row links (the LayerMask stays the same).
- Copy layer rows. Copies every row on this layer to the clipboard.
- Paste rows into layer. Pastes copied rows onto the current layer, retagging their LayerMask.
- Clear layer rows. Removes every row on this layer. The layer itself stays.
- Delete layer. Removes the layer and every row tagged to it. Confirms first.
When a shift layer engages, a Windows-11-style flyout appears at the bottom of the screen showing the layer's emoji icon and name. It auto-dismisses after 2 seconds.
The flyout scans every slot, not the currently-viewed pad. Engage a layer from any slot's activator and the flyout shows. Pick a different emoji and color per layer so multi-slot rigs read at a glance.
A slot can have many activators. When more than one is engaged at the same time, the most recently engaged wins. The active layer is whichever activator fired last.
Releasing the winning activator falls back to the next-most-recent still-engaged activator. Release them all and the slot returns to Base.
Goal. Hold or toggle a side button on the wheel and the face buttons of the slot's controller turn into pit-menu commands. Release to drive again.
- Open the slot. Open Mappings.
- On Base, bind the wheel and pedals to the steering and trigger axes. Leave the face buttons mapped to your normal in-car HUD.
- Click + Shift Layer.
-
Layer Name:
Pit Stop. - Activator Input: click Record, press the side button on the wheel rim.
- Mode: Toggle. One tap to open the menu, one tap to close.
- Layer Color: orange. Emoji Icon: 🔧.
- Inherit Unmapped Targets From Base: on. Steering, brakes, and clutch keep working while the menu is up.
- Click OK. The Pit Stop tab appears.
- Click the Pit Stop tab. Bind A, B, X, Y to your sim's pit menu commands (tires, fuel, repair, leave).
Tap the wheel button at the start of your pit lane. The flyout pops with the wrench. A/B/X/Y now drive the pit menu. Tap again on the way out. Pit Stop closes, face buttons return to the in-car HUD.
Shift activators and shift rows save inside the per-VC MappingSet. The MappingSet is per-profile by construction, so each profile keeps its own layer set without copying anything between them.
PadForge.xml stores activators as <ShiftActivator> elements under each slot's MappingSet. Rows on a shift layer are normal <Row> elements with their LayerMask attribute set to the layer's mask string.
Runtime engagement state (Toggle's engaged flag, Sticky's one-shot latch, Latch's and Cycle's current-layer pointer) lives on the InputManager. It resets on app launch, on profile switch, and on slot-index compaction.
- The activator input can be on a different device than the slot it shifts. Bind a foot-pedal button to shift your wheel slot.
- Two-layer setups are the most common. Reach for Cycle when one button should step through several layouts (menu → combat → vehicle in a sim shooter).
- The flyout is read at a glance, so pick a per-layer emoji that's distinct (🔧 vs ⚔ vs 🚗).
- Sticky mode is the right pick for one-tap moves you don't want to hold (Cancel on the next menu input, single emote after a kill).
- Cross-device chords cut accidental engagement. A wheel bumper plus a shifter button is hard to hit by accident in normal driving.
- A row's
CombineModeis fixed per row. If you need a target to combine sources differently per layer, build separate rows on each layer. - The engaged-layer flyout updates at the polling interval. At 1000 Hz it feels instant. At lower rates a fast activator press may briefly miss the flyout if it engages and releases inside one tick.
- Latch stays on its layer until you press the same button again (back to Base) or press a different Latch button (switch to that layer). It does not release on its own.
- Button and Axis Mappings: the layer tab strip sits above the mapping grid. Base rows are bound there too.
- Macros: Macros and shift layers stack. A macro can fire on a shift layer's input and the layer change still happens.
- Profiles: shift layers save per profile, so each game can run its own layer set.
- Controller Slots: every slot has its own MappingSet, so layers are per-slot.