From 7a05b4f98efe2e50408c8e3e5ee7372d67072ce1 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Wed, 3 Mar 2021 03:04:42 +1000 Subject: [PATCH] XInputControllerInterface: Support fullscreen UI navigation --- .../xinput_controller_interface.cpp | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/frontend-common/xinput_controller_interface.cpp b/src/frontend-common/xinput_controller_interface.cpp index 0d1da9879..8f0cdad40 100644 --- a/src/frontend-common/xinput_controller_interface.cpp +++ b/src/frontend-common/xinput_controller_interface.cpp @@ -279,9 +279,35 @@ bool XInputControllerInterface::HandleButtonEvent(u32 index, u32 button, bool pr Log_DevPrintf("controller %u button %u %s", index, button, pressed ? "pressed" : "released"); DebugAssert(index < XUSER_MAX_COUNT); + static constexpr std::array nav_button_mapping = {{ + FrontendCommon::ControllerNavigationButton::Activate, // XINPUT_GAMEPAD_A + FrontendCommon::ControllerNavigationButton::Cancel, // XINPUT_GAMEPAD_B + FrontendCommon::ControllerNavigationButton::Count, // XINPUT_GAMEPAD_X + FrontendCommon::ControllerNavigationButton::Count, // XINPUT_GAMEPAD_Y + FrontendCommon::ControllerNavigationButton::Count, // XINPUT_GAMEPAD_BACK + FrontendCommon::ControllerNavigationButton::Count, // XINPUT_GAMEPAD_GUIDE + FrontendCommon::ControllerNavigationButton::Count, // XINPUT_GAMEPAD_START + FrontendCommon::ControllerNavigationButton::Count, // XINPUT_GAMEPAD_LEFT_THUMB + FrontendCommon::ControllerNavigationButton::Count, // XINPUT_GAMEPAD_RIGHT_THUMB + FrontendCommon::ControllerNavigationButton::LeftShoulder, // XINPUT_GAMEPAD_LEFT_SHOULDER + FrontendCommon::ControllerNavigationButton::RightShoulder, // XINPUT_GAMEPAD_RIGHT_SHOULDER + FrontendCommon::ControllerNavigationButton::DPadUp, // XINPUT_GAMEPAD_DPAD_UP + FrontendCommon::ControllerNavigationButton::DPadDown, // XINPUT_GAMEPAD_DPAD_DOWN + FrontendCommon::ControllerNavigationButton::DPadLeft, // XINPUT_GAMEPAD_DPAD_LEFT + FrontendCommon::ControllerNavigationButton::DPadRight, // XINPUT_GAMEPAD_DPAD_RIGHT + }}; + if (DoEventHook(Hook::Type::Button, index, button, pressed ? 1.0f : 0.0f)) return true; + if (button < nav_button_mapping.size() && + nav_button_mapping[button] != FrontendCommon::ControllerNavigationButton::Count && + m_host_interface->SetControllerNavigationButtonState(nav_button_mapping[button], pressed)) + { + // UI consumed the event + return true; + } + const ButtonCallback& cb = m_controllers[index].button_mapping[button]; if (cb) {