Engine version: 5.7.1
File: Engine/Plugins/Runtime/GameInput/Source/GameInputBase/Private/GameInputDeviceProcessor.cpp
In the GameInput plugin, the three helpers on IGameInputDeviceProcessor that dispatch
messages to the FGenericApplicationMessageHandler are inconsistent about setting
FInputDeviceScope:
- OnControllerAnalog() → sets the scope (line ~146, gated by bSetDeviceScope)
- EvaluateButtonStates() → sets the scope (lines ~203 and ~222)
- EvaluateSwitchState() → does NOT set the scope at all
As a result, when a controller’s D-pad arrives as a hat switch (GameInputKindController
devices going through FGameInputControllerDeviceProcessor::ProcessControllerSwitchState,
and also FGameInputFlightStickDeviceProcessor’s hatSwitch), FInputDeviceScope::GetCurrent()
returns null inside the resulting Slate input event. FCommonInputPreprocessor
(CommonInputPreprocessor.cpp, ~line 242) therefore skips its automatic gamepad-type
detection entirely for those events. We are seeing this on Windows with a DualSense
configured via DeviceConfigurations (bProcessControllerSwitchState=True): pressing the
D-pad never updates the detected gamepad type, so CommonUI keeps showing the previously
detected button icons.
Is the omission in EvaluateSwitchState() deliberate, or is it a bug?