Change Keys and Gamepad Bindings
Choose default controls and let each local player remap them.
CalmUI provides mouse movement and clicks, wheel events, arrows, Tab/Shift+Tab,
Enter/Space/Escape, D-pad and left-stick navigation, and all four gamepad face
buttons: bottom = Accept, right = Back, left (X / □) = Secondary and top
(Y / △) = Tertiary. Secondary and Tertiary have no keyboard default; bind a
chord such as Enter + Shift / Enter + Alt in the profile asset or
through Rebind CalmUI Input if keyboard players need them (see
Secondary and tertiary).
Left-stick directions resolve through the active D-pad bindings, with a dead zone
and delayed repeat. Rebinding a D-pad key also changes its corresponding stick direction.
Held directions repeat on the UI frame tick even when the host sends analog
events only when the value changes. Releasing the stick or losing UI input
ownership clears the held direction.
Set different defaults
- In Unreal, create a Data Asset using Calm Ui Input Profile
(
UCalmUiInputProfile). - Set the keyboard/mouse and gamepad bindings in that asset.
- Assign it in Project Settings → Plugins → CalmUI → Input Profile.
- Run the game and test the controls.
Input Mapping Priority controls how this profile is ordered alongside other Unreal Enhanced Input mappings. Only change it if your game uses competing mappings.
Remap a control from Blueprint
The everyday prompt readers take the local Player Controller directly. Use the advanced Local Player API as Target only for profile editing, rebinding, reset, and change delegates.
| Node | Use it to… |
|---|---|
| Get CalmUI Action Prompt / Gameplay Action Prompt | Read the visible prompt from a Player Controller |
| Get CalmUI Input Method | Read the active device from a Player Controller |
| Get CalmUI Input Binding (Advanced) | Read the current key for an action and device |
| Rebind CalmUI Input (Advanced) | Assign a replacement key |
| Reset CalmUI Input Profile (Advanced) | Restore the selected profile's defaults |
| Apply CalmUI Input Profile (Advanced) | Apply another profile; a null asset uses built-in defaults |
| Is CalmUI Gamepad Connected | Check whether a gamepad is connected |
For Rebind, choose the action, device, and new key. Handle its result:
- Applied: display the new binding.
- Conflict: ask the player whether to replace the existing assignment, then retry with Replace Conflict enabled if they agree.
- Invalid: keep the previous binding and ask for a valid key.
Changes are saved per profile and local player in GameUserSettings.ini.
Resetting one player's profile does not reset another player's bindings.
Update button prompts
Use the GameUI ActionPrompt workflow and
OnCalmUiInputPromptsChanged to cover device, binding and culture changes.
Get CalmUI Action Prompt reads the navigation profile; Get CalmUI Gameplay Action Prompt reads the player's active Enhanced Input action mappings.
OnCalmUiInputMethodChanged remains available for device-only notifications.
Use OnCalmUiGamepadConnectionChanged for gamepad connection notifications.
Provide your own licensed controller artwork if the game displays button icons.
Text editing is not an input-profile action. Use the game's text-entry controls as explained in Text entry.
Keep gameplay input out of the UI
CalmUI receives navigation through Slate before focus traversal, including when the host uses Unreal's UI-only input mode. Matching navigation presses are consumed only for the owning local player while the game viewport has focus and a CalmUI screen owns input. Pointer and wheel input still use the Player Controller. Two queries on the local player subsystem carry that decision:
Is CalmUI Blocking Game Input: the focused screen stack usesui-onlyorblock-below. Switch the game's input model to its UI/modal mode here (and back when it turns false) so attack, camera zoom and the pause toggle stop firing under an inventory or dialog.OnCalmUiInputPolicyChangedfires with the new policy;Get CalmUI Input Policyreads it.Is CalmUI Pointer Over UI: the pointer rests on an interactive element (buttons, anything with an event handler) or a container markeddata-calmui-interactive="true", or CalmUI holds a pointer capture. Test it before world clicks, hover and wheel zoom onpassthroughandgame-and-uiscreens; mark HUD panels and drawers with the attribute so their body blocks the world too.
Under a passthrough screen CalmUI ignores keyboard and gamepad navigation,
Accept and Back so the game keeps them. Navigation is not polled again after
Slate delivery. While a screen owns the keyboard, let CalmUI handle
Back itself (every screen wires @back) instead of also closing the top screen
from the game's UI-cancel action.
For C++ binding-capture workflows, call
UCalmUiLocalPlayerSubsystem::SetCalmUiNavigationSuspended(true) when capture
starts and pass false on completion, cancellation, or owner teardown. Register
the host's Slate capture processor before CalmUI's appended processor and consume
captured events there. Suspension alone does not forward UI-only input to a Player
Controller. Use HasCalmUiViewportInputFocus(SlateUserIndex) to restrict host capture
to the owning user in the active game viewport window; it does not depend on the
navigation suspension flag or screen input policy.
The gate also accepts that player's focused CalmUI text sink in the viewport
overlay, so Tab navigation continues during text entry.
Text editing retains character, caret, selection and clipboard handling;
Tab and Shift+Tab use the active navigation profile.
Host-owned input modes
By default CalmUI applies the player controller input mode on every screen input-policy
change: GameOnly for Passthrough, GameAndUI for the others, plus the cursor and the
move/look ignore flags. A host that already drives input from OnCalmUiInputPolicyChanged
(its own mapping contexts, capture and lock rules) turns this off in Project Settings ->
CalmUI -> Apply host input mode (bApplyHostInputMode=False under
[/Script/CalmUiRuntime.CalmUiProjectSettings]). Leaving both active makes them fight:
GameOnly puts the viewport into permanent mouse capture, and in that mode the click that
re-acquires capture after a screen closes is swallowed before it reaches PlayerInput.
See Who owns the input mode for
the query functions (IsCalmUiBlockingGameInput, IsCalmUiPointerOverUi,
GetCalmUiInputPolicy) and the data-calmui-interactive overlay marker a host
driving its own input modes reads.