diff options
| author | Jordan Woyak <jordan.woyak@gmail.com> | 2020-01-26 13:58:20 -0600 |
|---|---|---|
| committer | Jordan Woyak <jordan.woyak@gmail.com> | 2020-09-25 20:29:18 -0500 |
| commit | d8ad8c386121e9c937360b102289231d86693dd1 (patch) | |
| tree | 9dffa8c6a38dd3b1de31d0236b35f76011b2664d /Source/Core/InputCommon/ControllerInterface/Device.cpp | |
| parent | aae913fbc6da714b3777e3a3c20fd06d1e423a0e (diff) | |
InputCommon: Make hotkeys and input detection aware of Ctrl -> L_Ctrl / R_Ctrl hierarchy.
Diffstat (limited to 'Source/Core/InputCommon/ControllerInterface/Device.cpp')
| -rw-r--r-- | Source/Core/InputCommon/ControllerInterface/Device.cpp | 74 |
1 files changed, 46 insertions, 28 deletions
diff --git a/Source/Core/InputCommon/ControllerInterface/Device.cpp b/Source/Core/InputCommon/ControllerInterface/Device.cpp index e57e1c7682..271a42c9ab 100644 --- a/Source/Core/InputCommon/ControllerInterface/Device.cpp +++ b/Source/Core/InputCommon/ControllerInterface/Device.cpp @@ -21,6 +21,38 @@ namespace ciface::Core // Note: Detect() logic assumes this is greater than 0.5. constexpr ControlState INPUT_DETECT_THRESHOLD = 0.55; +class CombinedInput final : public Device::Input +{ +public: + using Inputs = std::pair<Device::Input*, Device::Input*>; + + CombinedInput(std::string name, const Inputs& inputs) : m_name(std::move(name)), m_inputs(inputs) + { + } + ControlState GetState() const override + { + ControlState result = 0; + + if (m_inputs.first) + result = m_inputs.first->GetState(); + + if (m_inputs.second) + result = std::max(result, m_inputs.second->GetState()); + + return result; + } + std::string GetName() const override { return m_name; } + bool IsDetectable() const override { return false; } + bool IsChild(const Input* input) const override + { + return m_inputs.first == input || m_inputs.second == input; + } + +private: + const std::string m_name; + const std::pair<Device::Input*, Device::Input*> m_inputs; +}; + Device::~Device() { // delete inputs @@ -52,6 +84,20 @@ std::string Device::GetQualifiedName() const return fmt::format("{}/{}/{}", GetSource(), GetId(), GetName()); } +auto Device::GetParentMostInput(Input* child) const -> Input* +{ + for (auto* input : m_inputs) + { + if (input->IsChild(child)) + { + // Running recursively is currently unnecessary but it doesn't hurt. + return GetParentMostInput(input); + } + } + + return child; +} + Device::Input* Device::FindInput(std::string_view name) const { for (Input* input : m_inputs) @@ -103,34 +149,6 @@ bool Device::FullAnalogSurface::IsMatchingName(std::string_view name) const return old_name == name; } -Device::CombinedInput::CombinedInput(std::string name, const Inputs& inputs) - : m_name(std::move(name)), m_inputs(inputs) -{ -} - -ControlState Device::CombinedInput::GetState() const -{ - ControlState result = 0; - - if (m_inputs.first) - result = m_inputs.first->GetState(); - - if (m_inputs.second) - result = std::max(result, m_inputs.second->GetState()); - - return result; -} - -std::string Device::CombinedInput::GetName() const -{ - return m_name; -} - -bool Device::CombinedInput::IsDetectable() -{ - return false; -} - void Device::AddCombinedInput(std::string name, const std::pair<std::string, std::string>& inputs) { AddInput(new CombinedInput(std::move(name), {FindInput(inputs.first), FindInput(inputs.second)})); |
