From f8d9e6eeb8c7c595d6c91d11ec4cbe62732290f0 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Mon, 12 Sep 2022 23:27:37 +1000 Subject: [PATCH] InputManager: Split AddBinding() and AddBindings() --- pcsx2/Frontend/InputManager.cpp | 74 +++++++++++++++++---------------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/pcsx2/Frontend/InputManager.cpp b/pcsx2/Frontend/InputManager.cpp index 2ddb278fa5..0fbf987e93 100644 --- a/pcsx2/Frontend/InputManager.cpp +++ b/pcsx2/Frontend/InputManager.cpp @@ -99,6 +99,7 @@ namespace InputManager static std::vector SplitChord(const std::string_view& binding); static bool SplitBinding(const std::string_view& binding, std::string_view* source, std::string_view* sub_binding); + static void AddBinding(const std::string_view& binding, const InputEventHandler& handler); static void AddBindings(const std::vector& bindings, const InputEventHandler& handler); static bool ParseBindingAndGetSource(const std::string_view& binding, InputBindingKey* key, InputSource** source); @@ -304,48 +305,51 @@ std::string InputManager::ConvertInputBindingKeysToString(const InputBindingKey* return ss.str(); } -void InputManager::AddBindings(const std::vector& bindings, const InputEventHandler& handler) +void InputManager::AddBinding(const std::string_view& binding, const InputEventHandler& handler) { - for (const std::string& binding : bindings) + std::shared_ptr ibinding; + const std::vector chord_bindings(SplitChord(binding)); + + for (const std::string_view& chord_binding : chord_bindings) { - std::shared_ptr ibinding; - const std::vector chord_bindings(SplitChord(binding)); - - for (const std::string_view& chord_binding : chord_bindings) + std::optional key = ParseInputBindingKey(chord_binding); + if (!key.has_value()) { - std::optional key = ParseInputBindingKey(chord_binding); - if (!key.has_value()) - { - Console.WriteLn("Invalid binding: '%s'", binding.c_str()); - ibinding.reset(); - break; - } - - if (!ibinding) - { - ibinding = std::make_shared(); - ibinding->handler = handler; - } - - if (ibinding->num_keys == MAX_KEYS_PER_BINDING) - { - Console.WriteLn("Too many chord parts, max is %u (%s)", MAX_KEYS_PER_BINDING, binding.c_str()); - ibinding.reset(); - break; - } - - ibinding->keys[ibinding->num_keys] = key.value(); - ibinding->full_mask |= (static_cast(1) << ibinding->num_keys); - ibinding->num_keys++; + Console.WriteLn(fmt::format("Invalid binding: '{}'", binding)); + ibinding.reset(); + break; } if (!ibinding) - continue; + { + ibinding = std::make_shared(); + ibinding->handler = handler; + } - // plop it in the input map for all the keys - for (u32 i = 0; i < ibinding->num_keys; i++) - s_binding_map.emplace(ibinding->keys[i].MaskDirection(), ibinding); + if (ibinding->num_keys == MAX_KEYS_PER_BINDING) + { + Console.WriteLn(fmt::format("Too many chord parts, max is {} ({})", MAX_KEYS_PER_BINDING, binding)); + ibinding.reset(); + break; + } + + ibinding->keys[ibinding->num_keys] = key.value(); + ibinding->full_mask |= (static_cast(1) << ibinding->num_keys); + ibinding->num_keys++; } + + if (!ibinding) + return; + + // plop it in the input map for all the keys + for (u32 i = 0; i < ibinding->num_keys; i++) + s_binding_map.emplace(ibinding->keys[i].MaskDirection(), ibinding); +} + +void InputManager::AddBindings(const std::vector& bindings, const InputEventHandler& handler) +{ + for (const std::string& binding : bindings) + AddBinding(binding, handler); } // ------------------------------------------------------------------------ @@ -559,7 +563,7 @@ void InputManager::AddPadBindings(SettingsInterface& si, u32 pad_index, const ch if (!bindings.empty()) { // we use axes for all pad bindings to simplify things, and because they are pressure sensitive - AddBindings(bindings, InputAxisEventHandler{[pad_index, bind_index, bind_names]( + AddBindings(bindings, InputAxisEventHandler{[pad_index, bind_index]( float value) { PAD::SetControllerState(pad_index, bind_index, value); }}); } }