Gamepad
Spatial navigation, remapping, hot-plug state, and :gamepad-focus for each Local Player.
D-pad moves focus. Face button bottom accepts. Face button right is Back. Face
button left (X / □) and face button top (Y / △) are the focused control's
@secondary and @tertiary activations, "□ Drop", "△ Compare", which bubble
to the screen root like Accept and have no default action (see
Secondary and tertiary activations
and the Unreal delivery details).
CSS may use :gamepad-focus in addition to :focus.
A control authored with ui:hold-ms activates only after the face button has
been held for that long (the release before that cancels); it then carries
:holding and --calmui-hold-progress for the duration - see
Hold to activate.
Views open without a focus ring for pointer users; the first directional input
selects an eligible autofocus control, falling back to the lowest authored focus
order. In Studio's source editor, put autofocus on the intended native control:
<button autofocus>Load slot</button>Use :autofocus="initialFocus" for a boolean binding. A reusable component must
forward that prop onto its focusable control. As with other boolean attributes,
omit the attribute to disable it; autofocus="false" still means present.
Hidden, disabled and non-focusable controls are skipped. Multiple eligible
defaults use authored focus order. Ordinary patches preserve the current focus;
the attribute does not change Tab order or steal focus when it becomes true.
When a modal or a removed control changes the selection during a tree update,
Unreal delivers the resulting focus event after binding the current controls.
Repeated tree updates with the same selection do not repeat @focus.
Managed screens activated from controller focus immediately retain controller
focus on their saved selection, or choose the initial control when none is saved.
Hidden or disabled explicit
ui:nav-* targets are skipped through spatial fallback, so Store-driven state
changes do not leave the player trapped on the previous control. When a modal
opens from controller focus, its eligible default action receives the gamepad focus
ring; a pointer-opened modal keeps ordinary focus styling.
Explicit ui:nav-up / ui:nav-down attributes appear on Showcase MenuButton for ordered menus.
Check one complete controller path
- Open the View in Unreal with the gamepad you intend to support.
- Press a direction and confirm the intended first control receives
:gamepad-focus. - Move through every enabled control in both directions. Disable or hide one target through the Store and repeat the route.
- Open a modal from controller focus. Confirm focus moves inside it, background controls stop responding, and Back follows the dialog's policy.
- Close the modal and confirm focus returns to the previous eligible control.
- Disconnect and reconnect the controller, then test any remapped profile.
Studio's forced gamepad-focus state checks styling. The real Unreal path checks
Enhanced Input, Local Player ownership, modal focus, hot-plug state, and gameplay
conflicts.
Use a UCalmUiInputProfile to replace the defaults. OnCalmUiInputMethodChanged
lets prompts switch between keyboard/mouse and gamepad without polling. See
Input profiles and rebinding.
CalmUI does not redistribute controller glyph families. Supply only glyph assets that your project is licensed to ship; platform key names do not grant artwork redistribution rights.