diff --git a/src/frontend-common/common_host_interface.cpp b/src/frontend-common/common_host_interface.cpp index 4958ec047..36c53fcba 100644 --- a/src/frontend-common/common_host_interface.cpp +++ b/src/frontend-common/common_host_interface.cpp @@ -1538,21 +1538,9 @@ bool CommonHostInterface::AddButtonToInputMap(const std::string& binding, const return false; } - if (StringUtil::StartsWith(device, "Controller")) + std::optional controller_index; + if (m_controller_interface && (controller_index = m_controller_interface->GetControllerIndex(device))) { - if (!m_controller_interface) - { - Log_ErrorPrintf("No controller interface set, cannot bind '%s'", binding.c_str()); - return false; - } - - const std::optional controller_index = StringUtil::FromChars(device.substr(10)); - if (!controller_index || *controller_index < 0) - { - Log_WarningPrintf("Invalid controller index in button binding '%s'", binding.c_str()); - return false; - } - if (StringUtil::StartsWith(button, "Button")) { const std::optional button_index = StringUtil::FromChars(button.substr(6)); @@ -1652,21 +1640,9 @@ bool CommonHostInterface::AddAxisToInputMap(const std::string& binding, const st } } - if (StringUtil::StartsWith(device, "Controller")) + std::optional controller_index; + if (m_controller_interface && (controller_index = m_controller_interface->GetControllerIndex(device))) { - if (!m_controller_interface) - { - Log_ErrorPrintf("No controller interface set, cannot bind '%s'", binding.c_str()); - return false; - } - - const std::optional controller_index = StringUtil::FromChars(device.substr(10)); - if (!controller_index || *controller_index < 0) - { - Log_WarningPrintf("Invalid controller index in axis binding '%s'", binding.c_str()); - return false; - } - if (StringUtil::StartsWith(axis, "Axis") || StringUtil::StartsWith(axis, "+Axis") || StringUtil::StartsWith(axis, "-Axis")) { @@ -1723,21 +1699,9 @@ bool CommonHostInterface::AddAxisToInputMap(const std::string& binding, const st bool CommonHostInterface::AddRumbleToInputMap(const std::string& binding, u32 controller_index, u32 num_motors) { - if (StringUtil::StartsWith(binding, "Controller")) + std::optional host_controller_index; + if (m_controller_interface && (host_controller_index = m_controller_interface->GetControllerIndex(binding))) { - if (!m_controller_interface) - { - Log_ErrorPrintf("No controller interface set, cannot bind '%s'", binding.c_str()); - return false; - } - - const std::optional host_controller_index = StringUtil::FromChars(binding.substr(10)); - if (!host_controller_index || *host_controller_index < 0) - { - Log_WarningPrintf("Invalid controller index in rumble binding '%s'", binding.c_str()); - return false; - } - AddControllerRumble(controller_index, num_motors, std::bind(&ControllerInterface::SetControllerRumbleStrength, m_controller_interface.get(), host_controller_index.value(), std::placeholders::_1, std::placeholders::_2)); diff --git a/src/frontend-common/common_host_interface.h b/src/frontend-common/common_host_interface.h index cd835188a..b61ea5974 100644 --- a/src/frontend-common/common_host_interface.h +++ b/src/frontend-common/common_host_interface.h @@ -356,7 +356,7 @@ protected: void RegisterHotkey(String category, String name, String display_name, InputButtonHandler handler); bool HandleHostKeyEvent(HostKeyCode code, HostKeyCode modifiers, bool pressed); bool HandleHostMouseEvent(HostMouseButton button, bool pressed); - void UpdateInputMap(SettingsInterface& si); + virtual void UpdateInputMap(SettingsInterface& si); void ClearInputMap(); void AddControllerRumble(u32 controller_index, u32 num_motors, ControllerRumbleCallback callback); diff --git a/src/frontend-common/controller_interface.cpp b/src/frontend-common/controller_interface.cpp index d333292da..90134011f 100644 --- a/src/frontend-common/controller_interface.cpp +++ b/src/frontend-common/controller_interface.cpp @@ -22,6 +22,22 @@ void ControllerInterface::Shutdown() m_host_interface = nullptr; } +std::optional ControllerInterface::GetControllerIndex(const std::string_view& device) +{ + if (!StringUtil::StartsWith(device, "Controller")) + return std::nullopt; + + const std::optional controller_index = StringUtil::FromChars(device.substr(10)); + if (!controller_index || *controller_index < 0) + { + Log_WarningPrintf("Invalid controller index in button binding '%*s'", static_cast(device.length()), + device.data()); + return std::nullopt; + } + + return controller_index; +} + void ControllerInterface::SetHook(Hook::Callback callback) { std::unique_lock lock(m_event_intercept_mutex); diff --git a/src/frontend-common/controller_interface.h b/src/frontend-common/controller_interface.h index feae1c2e8..f97d0f6cd 100644 --- a/src/frontend-common/controller_interface.h +++ b/src/frontend-common/controller_interface.h @@ -6,6 +6,7 @@ #include #include #include +#include #include class HostInterface; @@ -70,6 +71,7 @@ public: virtual void ClearBindings() = 0; // Binding to events. If a binding for this axis/button already exists, returns false. + virtual std::optional GetControllerIndex(const std::string_view& device); virtual bool BindControllerAxis(int controller_index, int axis_number, AxisSide axis_side, AxisCallback callback) = 0; virtual bool BindControllerButton(int controller_index, int button_number, ButtonCallback callback) = 0; virtual bool BindControllerAxisToButton(int controller_index, int axis_number, bool direction,