Controller: Use std::span

This commit is contained in:
Stenzek 2023-09-20 17:10:41 +10:00
parent 539b406c95
commit 3cd28f433b
12 changed files with 45 additions and 120 deletions

View file

@ -875,9 +875,7 @@ const Controller::ControllerInfo AnalogController::INFO = {ControllerType::Analo
"AnalogController", "AnalogController",
TRANSLATE_NOOP("ControllerType", "Analog Controller"), TRANSLATE_NOOP("ControllerType", "Analog Controller"),
s_binding_info, s_binding_info,
countof(s_binding_info),
s_settings, s_settings,
countof(s_settings),
Controller::VibrationCapabilities::LargeSmallMotors}; Controller::VibrationCapabilities::LargeSmallMotors};
void AnalogController::LoadSettings(SettingsInterface& si, const char* section) void AnalogController::LoadSettings(SettingsInterface& si, const char* section)

View file

@ -407,9 +407,7 @@ const Controller::ControllerInfo AnalogJoystick::INFO = {ControllerType::AnalogJ
"AnalogJoystick", "AnalogJoystick",
TRANSLATE_NOOP("ControllerType", "Analog Joystick"), TRANSLATE_NOOP("ControllerType", "Analog Joystick"),
s_binding_info, s_binding_info,
countof(s_binding_info),
s_settings, s_settings,
countof(s_settings),
Controller::VibrationCapabilities::NoVibration}; Controller::VibrationCapabilities::NoVibration};
void AnalogJoystick::LoadSettings(SettingsInterface& si, const char* section) void AnalogJoystick::LoadSettings(SettingsInterface& si, const char* section)

View file

@ -15,10 +15,8 @@
static const Controller::ControllerInfo s_none_info = {ControllerType::None, static const Controller::ControllerInfo s_none_info = {ControllerType::None,
"None", "None",
TRANSLATE_NOOP("ControllerType", "Not Connected"), TRANSLATE_NOOP("ControllerType", "Not Connected"),
nullptr, {},
0, {},
nullptr,
0,
Controller::VibrationCapabilities::NoVibration}; Controller::VibrationCapabilities::NoVibration};
static const Controller::ControllerInfo* s_controller_info[] = { static const Controller::ControllerInfo* s_controller_info[] = {
@ -144,53 +142,13 @@ std::vector<std::pair<std::string, std::string>> Controller::GetControllerTypeNa
return ret; return ret;
} }
std::vector<std::string> Controller::GetControllerBinds(const std::string_view& type)
{
std::vector<std::string> ret;
const ControllerInfo* info = GetControllerInfo(type);
if (info)
{
for (u32 i = 0; i < info->num_bindings; i++)
{
const ControllerBindingInfo& bi = info->bindings[i];
if (bi.type == InputBindingInfo::Type::Unknown || bi.type == InputBindingInfo::Type::Motor)
continue;
ret.emplace_back(info->bindings[i].name);
}
}
return ret;
}
std::vector<std::string> Controller::GetControllerBinds(ControllerType type)
{
std::vector<std::string> ret;
const ControllerInfo* info = GetControllerInfo(type);
if (info)
{
for (u32 i = 0; i < info->num_bindings; i++)
{
const ControllerBindingInfo& bi = info->bindings[i];
if (bi.type == InputBindingInfo::Type::Unknown || bi.type == InputBindingInfo::Type::Motor)
continue;
ret.emplace_back(info->bindings[i].name);
}
}
return ret;
}
std::optional<u32> Controller::GetBindIndex(ControllerType type, const std::string_view& bind_name) std::optional<u32> Controller::GetBindIndex(ControllerType type, const std::string_view& bind_name)
{ {
const ControllerInfo* info = GetControllerInfo(type); const ControllerInfo* info = GetControllerInfo(type);
if (!info) if (!info)
return std::nullopt; return std::nullopt;
for (u32 i = 0; i < info->num_bindings; i++) for (u32 i = 0; i < static_cast<u32>(info->bindings.size()); i++)
{ {
if (bind_name == info->bindings[i].name) if (bind_name == info->bindings[i].name)
return i; return i;

View file

@ -1,13 +1,17 @@
// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin <stenzek@gmail.com> // SPDX-FileCopyrightText: 2019-2023 Connor McLaughlin <stenzek@gmail.com>
// SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
#pragma once #pragma once
#include "common/image.h"
#include "input_types.h" #include "input_types.h"
#include "settings.h" #include "settings.h"
#include "types.h" #include "types.h"
#include "common/image.h"
#include <memory> #include <memory>
#include <optional> #include <optional>
#include <span>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <tuple> #include <tuple>
@ -42,10 +46,8 @@ public:
ControllerType type; ControllerType type;
const char* name; const char* name;
const char* display_name; const char* display_name;
const ControllerBindingInfo* bindings; std::span<const ControllerBindingInfo> bindings;
u32 num_bindings; std::span<const SettingInfo> settings;
const SettingInfo* settings;
u32 num_settings;
VibrationCapabilities vibration_caps; VibrationCapabilities vibration_caps;
}; };
@ -96,10 +98,6 @@ public:
/// Returns a list of controller type names. Pair of [name, display name]. /// Returns a list of controller type names. Pair of [name, display name].
static std::vector<std::pair<std::string, std::string>> GetControllerTypeNames(); static std::vector<std::pair<std::string, std::string>> GetControllerTypeNames();
/// Returns the list of binds for the specified controller type.
static std::vector<std::string> GetControllerBinds(const std::string_view& type);
static std::vector<std::string> GetControllerBinds(ControllerType type);
/// Gets the integer code for an axis in the specified controller type. /// Gets the integer code for an axis in the specified controller type.
static std::optional<u32> GetBindIndex(ControllerType type, const std::string_view& bind_name); static std::optional<u32> GetBindIndex(ControllerType type, const std::string_view& bind_name);

View file

@ -178,9 +178,7 @@ const Controller::ControllerInfo DigitalController::INFO = {ControllerType::Digi
"DigitalController", "DigitalController",
TRANSLATE_NOOP("ControllerType", "Digital Controller"), TRANSLATE_NOOP("ControllerType", "Digital Controller"),
s_binding_info, s_binding_info,
countof(s_binding_info),
s_settings, s_settings,
countof(s_settings),
Controller::VibrationCapabilities::NoVibration}; Controller::VibrationCapabilities::NoVibration};
void DigitalController::LoadSettings(SettingsInterface& si, const char* section) void DigitalController::LoadSettings(SettingsInterface& si, const char* section)

View file

@ -96,9 +96,9 @@ using ImGuiFullscreen::UIPrimaryLightColor;
using ImGuiFullscreen::UIPrimaryLineColor; using ImGuiFullscreen::UIPrimaryLineColor;
using ImGuiFullscreen::UIPrimaryTextColor; using ImGuiFullscreen::UIPrimaryTextColor;
using ImGuiFullscreen::UISecondaryColor; using ImGuiFullscreen::UISecondaryColor;
using ImGuiFullscreen::UISecondaryWeakColor;
using ImGuiFullscreen::UISecondaryStrongColor; using ImGuiFullscreen::UISecondaryStrongColor;
using ImGuiFullscreen::UISecondaryTextColor; using ImGuiFullscreen::UISecondaryTextColor;
using ImGuiFullscreen::UISecondaryWeakColor;
using ImGuiFullscreen::UITextHighlightColor; using ImGuiFullscreen::UITextHighlightColor;
using ImGuiFullscreen::ActiveButton; using ImGuiFullscreen::ActiveButton;
@ -1114,9 +1114,8 @@ void FullscreenUI::DoToggleAnalogMode()
if (!cinfo) if (!cinfo)
continue; continue;
for (u32 j = 0; j < cinfo->num_bindings; j++) for (const Controller::ControllerBindingInfo& bi : cinfo->bindings)
{ {
const Controller::ControllerBindingInfo& bi = cinfo->bindings[j];
if (std::strcmp(bi.name, "Analog") == 0) if (std::strcmp(bi.name, "Analog") == 0)
{ {
ctrl->SetBindState(bi.bind_index, 1.0f); ctrl->SetBindState(bi.bind_index, 1.0f);
@ -3314,7 +3313,7 @@ void FullscreenUI::DrawControllerSettingsPage()
}); });
} }
if (!ci || ci->num_bindings == 0) if (!ci || ci->bindings.empty() == 0)
continue; continue;
if (MenuButton(FSUI_ICONSTR(ICON_FA_MAGIC, "Automatic Mapping"), if (MenuButton(FSUI_ICONSTR(ICON_FA_MAGIC, "Automatic Mapping"),
@ -3323,11 +3322,8 @@ void FullscreenUI::DrawControllerSettingsPage()
StartAutomaticBinding(global_slot); StartAutomaticBinding(global_slot);
} }
for (u32 i = 0; i < ci->num_bindings; i++) for (const Controller::ControllerBindingInfo& bi : ci->bindings)
{
const Controller::ControllerBindingInfo& bi = ci->bindings[i];
DrawInputBindingButton(bsi, bi.type, section.c_str(), bi.name, bi.display_name, true); DrawInputBindingButton(bsi, bi.type, section.c_str(), bi.name, bi.display_name, true);
}
if (mtap_enabled[mtap_port]) if (mtap_enabled[mtap_port])
{ {
@ -3354,9 +3350,8 @@ void FullscreenUI::DrawControllerSettingsPage()
{ {
std::vector<std::string_view> buttons_split(StringUtil::SplitString(binds_string, '&', true)); std::vector<std::string_view> buttons_split(StringUtil::SplitString(binds_string, '&', true));
ImGuiFullscreen::ChoiceDialogOptions options; ImGuiFullscreen::ChoiceDialogOptions options;
for (u32 i = 0; i < ci->num_bindings; i++) for (const Controller::ControllerBindingInfo& bi : ci->bindings)
{ {
const Controller::ControllerBindingInfo& bi = ci->bindings[i];
if (bi.type != InputBindingInfo::Type::Button && bi.type != InputBindingInfo::Type::Axis && if (bi.type != InputBindingInfo::Type::Button && bi.type != InputBindingInfo::Type::Axis &&
bi.type != InputBindingInfo::Type::HalfAxis) bi.type != InputBindingInfo::Type::HalfAxis)
{ {
@ -3372,9 +3367,8 @@ void FullscreenUI::DrawControllerSettingsPage()
[game_settings, section, macro_index, ci](s32 index, const std::string& title, bool checked) { [game_settings, section, macro_index, ci](s32 index, const std::string& title, bool checked) {
// convert display name back to bind name // convert display name back to bind name
std::string_view to_modify; std::string_view to_modify;
for (u32 j = 0; j < ci->num_bindings; j++) for (const Controller::ControllerBindingInfo& bi : ci->bindings)
{ {
const Controller::ControllerBindingInfo& bi = ci->bindings[j];
if (bi.display_name == title) if (bi.display_name == title)
{ {
to_modify = bi.name; to_modify = bi.name;
@ -3458,7 +3452,7 @@ void FullscreenUI::DrawControllerSettingsPage()
ImGui::PopFont(); ImGui::PopFont();
} }
if (ci->num_settings > 0) if (!ci->settings.empty())
{ {
if (mtap_enabled[mtap_port]) if (mtap_enabled[mtap_port])
{ {
@ -3471,9 +3465,8 @@ void FullscreenUI::DrawControllerSettingsPage()
mtap_port + 1)); mtap_port + 1));
} }
for (u32 i = 0; i < ci->num_settings; i++) for (const SettingInfo& si : ci->settings)
{ {
const SettingInfo& si = ci->settings[i];
TinyString title; TinyString title;
title.Fmt(ICON_FA_COG "{}", si.display_name); title.Fmt(ICON_FA_COG "{}", si.display_name);
switch (si.type) switch (si.type)
@ -4715,8 +4708,7 @@ void FullscreenUI::DrawPauseMenu()
subtitle_pos.x -= rp_height; subtitle_pos.x -= rp_height;
subtitle_pos.y -= rp_height; subtitle_pos.y -= rp_height;
DrawShadowedText(dl, g_medium_font, rp_pos, text_color, rp.data(), rp.data() + rp.size(), DrawShadowedText(dl, g_medium_font, rp_pos, text_color, rp.data(), rp.data() + rp.size(), wrap_width);
wrap_width);
} }
} }

View file

@ -304,9 +304,7 @@ const Controller::ControllerInfo GunCon::INFO = {ControllerType::GunCon,
"GunCon", "GunCon",
TRANSLATE_NOOP("ControllerType", "GunCon"), TRANSLATE_NOOP("ControllerType", "GunCon"),
s_binding_info, s_binding_info,
countof(s_binding_info),
s_settings, s_settings,
countof(s_settings),
Controller::VibrationCapabilities::NoVibration}; Controller::VibrationCapabilities::NoVibration};
void GunCon::LoadSettings(SettingsInterface& si, const char* section) void GunCon::LoadSettings(SettingsInterface& si, const char* section)

View file

@ -627,9 +627,8 @@ void ImGuiManager::DrawInputsOverlay()
text.Fmt("P{} |", port + 1u); text.Fmt("P{} |", port + 1u);
for (u32 bind = 0; bind < cinfo->num_bindings; bind++) for (const Controller::ControllerBindingInfo& bi : cinfo->bindings)
{ {
const Controller::ControllerBindingInfo& bi = cinfo->bindings[bind];
switch (bi.type) switch (bi.type)
{ {
case InputBindingInfo::Type::Axis: case InputBindingInfo::Type::Axis:

View file

@ -269,9 +269,7 @@ const Controller::ControllerInfo NeGcon::INFO = {ControllerType::NeGcon,
"NeGcon", "NeGcon",
TRANSLATE_NOOP("ControllerType", "NeGcon"), TRANSLATE_NOOP("ControllerType", "NeGcon"),
s_binding_info, s_binding_info,
countof(s_binding_info),
s_settings, s_settings,
countof(s_settings),
Controller::VibrationCapabilities::NoVibration}; Controller::VibrationCapabilities::NoVibration};
void NeGcon::LoadSettings(SettingsInterface& si, const char* section) void NeGcon::LoadSettings(SettingsInterface& si, const char* section)

View file

@ -219,7 +219,5 @@ const Controller::ControllerInfo PlayStationMouse::INFO = {ControllerType::PlayS
"PlayStationMouse", "PlayStationMouse",
TRANSLATE_NOOP("ControllerType", "PlayStation Mouse"), TRANSLATE_NOOP("ControllerType", "PlayStation Mouse"),
s_binding_info, s_binding_info,
countof(s_binding_info),
s_settings, s_settings,
countof(s_settings),
Controller::VibrationCapabilities::NoVibration}; Controller::VibrationCapabilities::NoVibration};

View file

@ -98,8 +98,8 @@ void ControllerBindingWidget::populateWidgets()
} }
const Controller::ControllerInfo* cinfo = Controller::GetControllerInfo(m_controller_type); const Controller::ControllerInfo* cinfo = Controller::GetControllerInfo(m_controller_type);
const bool has_settings = (cinfo && cinfo->num_settings > 0); const bool has_settings = (cinfo && !cinfo->settings.empty());
const bool has_macros = (cinfo && cinfo->num_bindings > 0); const bool has_macros = (cinfo && !cinfo->bindings.empty());
m_ui.settings->setEnabled(has_settings); m_ui.settings->setEnabled(has_settings);
m_ui.macros->setEnabled(has_macros); m_ui.macros->setEnabled(has_macros);
@ -360,20 +360,19 @@ ControllerMacroEditWidget::ControllerMacroEditWidget(ControllerMacroWidget* pare
for (const std::string_view& button : buttons_split) for (const std::string_view& button : buttons_split)
{ {
for (u32 i = 0; i < cinfo->num_bindings; i++) for (const Controller::ControllerBindingInfo& bi : cinfo->bindings)
{ {
if (button == cinfo->bindings[i].name) if (button == bi.name)
{ {
m_binds.push_back(&cinfo->bindings[i]); m_binds.push_back(&bi);
break; break;
} }
} }
} }
// populate list view // populate list view
for (u32 i = 0; i < cinfo->num_bindings; i++) for (const Controller::ControllerBindingInfo& bi : cinfo->bindings)
{ {
const Controller::ControllerBindingInfo& bi = cinfo->bindings[i];
if (bi.type == InputBindingInfo::Type::Motor) if (bi.type == InputBindingInfo::Type::Motor)
continue; continue;
@ -455,9 +454,9 @@ void ControllerMacroEditWidget::updateBinds()
return; return;
std::vector<const Controller::ControllerBindingInfo*> new_binds; std::vector<const Controller::ControllerBindingInfo*> new_binds;
for (u32 i = 0, bind_index = 0; i < cinfo->num_bindings; i++) u32 bind_index = 0;
for (const Controller::ControllerBindingInfo& bi : cinfo->bindings)
{ {
const Controller::ControllerBindingInfo& bi = cinfo->bindings[i];
if (bi.type == InputBindingInfo::Type::Motor) if (bi.type == InputBindingInfo::Type::Motor)
continue; continue;
@ -471,7 +470,7 @@ void ControllerMacroEditWidget::updateBinds()
} }
if (item->checkState() == Qt::Checked) if (item->checkState() == Qt::Checked)
new_binds.push_back(&cinfo->bindings[i]); new_binds.push_back(&bi);
} }
if (m_binds == new_binds) if (m_binds == new_binds)
return; return;
@ -502,7 +501,7 @@ ControllerCustomSettingsWidget::ControllerCustomSettingsWidget(ControllerBinding
: QWidget(parent), m_parent(parent) : QWidget(parent), m_parent(parent)
{ {
const Controller::ControllerInfo* cinfo = Controller::GetControllerInfo(parent->getControllerType()); const Controller::ControllerInfo* cinfo = Controller::GetControllerInfo(parent->getControllerType());
if (!cinfo || cinfo->num_settings == 0) if (!cinfo || cinfo->settings.empty())
return; return;
QGroupBox* gbox = new QGroupBox(tr("%1 Settings").arg(qApp->translate("ControllerType", cinfo->display_name)), this); QGroupBox* gbox = new QGroupBox(tr("%1 Settings").arg(qApp->translate("ControllerType", cinfo->display_name)), this);
@ -534,9 +533,8 @@ void ControllerCustomSettingsWidget::createSettingWidgets(ControllerBindingWidge
SettingsInterface* sif = parent->getDialog()->getProfileSettingsInterface(); SettingsInterface* sif = parent->getDialog()->getProfileSettingsInterface();
int current_row = 0; int current_row = 0;
for (u32 i = 0; i < cinfo->num_settings; i++) for (const SettingInfo& si : cinfo->settings)
{ {
const SettingInfo& si = cinfo->settings[i];
std::string key_name = si.name; std::string key_name = si.name;
switch (si.type) switch (si.type)
@ -658,12 +656,11 @@ void ControllerCustomSettingsWidget::createSettingWidgets(ControllerBindingWidge
void ControllerCustomSettingsWidget::restoreDefaults() void ControllerCustomSettingsWidget::restoreDefaults()
{ {
const Controller::ControllerInfo* cinfo = Controller::GetControllerInfo(m_parent->getControllerType()); const Controller::ControllerInfo* cinfo = Controller::GetControllerInfo(m_parent->getControllerType());
if (!cinfo || cinfo->num_settings == 0) if (!cinfo || cinfo->settings.empty())
return; return;
for (u32 i = 0; i < cinfo->num_settings; i++) for (const SettingInfo& si : cinfo->settings)
{ {
const SettingInfo& si = cinfo->settings[i];
const QString key(QString::fromStdString(si.name)); const QString key(QString::fromStdString(si.name));
switch (si.type) switch (si.type)
@ -748,9 +745,8 @@ void ControllerBindingWidget_Base::initBindingWidgets()
return; return;
const std::string& config_section = getConfigSection(); const std::string& config_section = getConfigSection();
for (u32 i = 0; i < cinfo->num_bindings; i++) for (const Controller::ControllerBindingInfo& bi : cinfo->bindings)
{ {
const Controller::ControllerBindingInfo& bi = cinfo->bindings[i];
if (bi.type == InputBindingInfo::Type::Axis || bi.type == InputBindingInfo::Type::HalfAxis || if (bi.type == InputBindingInfo::Type::Axis || bi.type == InputBindingInfo::Type::HalfAxis ||
bi.type == InputBindingInfo::Type::Button || bi.type == InputBindingInfo::Type::Pointer) bi.type == InputBindingInfo::Type::Button || bi.type == InputBindingInfo::Type::Pointer)
{ {

View file

@ -698,9 +698,8 @@ void InputManager::AddHotkeyBindings(SettingsInterface& si)
void InputManager::AddPadBindings(SettingsInterface& si, const std::string& section, u32 pad_index, void InputManager::AddPadBindings(SettingsInterface& si, const std::string& section, u32 pad_index,
const Controller::ControllerInfo* cinfo) const Controller::ControllerInfo* cinfo)
{ {
for (u32 i = 0; i < cinfo->num_bindings; i++) for (const Controller::ControllerBindingInfo& bi : cinfo->bindings)
{ {
const Controller::ControllerBindingInfo& bi = cinfo->bindings[i];
const std::vector<std::string> bindings(si.GetStringList(section.c_str(), bi.name)); const std::vector<std::string> bindings(si.GetStringList(section.c_str(), bi.name));
switch (bi.type) switch (bi.type)
@ -1170,8 +1169,8 @@ void InputManager::ClearPortBindings(SettingsInterface& si, u32 port)
if (!info) if (!info)
return; return;
for (u32 i = 0; i < info->num_bindings; i++) for (const Controller::ControllerBindingInfo& bi : info->bindings)
si.DeleteValue(section.c_str(), info->bindings[i].name); si.DeleteValue(section.c_str(), bi.name);
} }
void InputManager::CopyConfiguration(SettingsInterface* dest_si, const SettingsInterface& src_si, void InputManager::CopyConfiguration(SettingsInterface* dest_si, const SettingsInterface& src_si,
@ -1201,11 +1200,8 @@ void InputManager::CopyConfiguration(SettingsInterface* dest_si, const SettingsI
if (copy_pad_bindings) if (copy_pad_bindings)
{ {
for (u32 i = 0; i < info->num_bindings; i++) for (const Controller::ControllerBindingInfo& bi : info->bindings)
{
const Controller::ControllerBindingInfo& bi = info->bindings[i];
dest_si->CopyStringListValue(src_si, section.c_str(), bi.name); dest_si->CopyStringListValue(src_si, section.c_str(), bi.name);
}
for (u32 i = 0; i < NUM_MACRO_BUTTONS_PER_CONTROLLER; i++) for (u32 i = 0; i < NUM_MACRO_BUTTONS_PER_CONTROLLER; i++)
{ {
@ -1217,9 +1213,8 @@ void InputManager::CopyConfiguration(SettingsInterface* dest_si, const SettingsI
if (copy_pad_config) if (copy_pad_config)
{ {
for (u32 i = 0; i < info->num_settings; i++) for (const SettingInfo& csi : info->settings)
{ {
const SettingInfo& csi = info->settings[i];
switch (csi.type) switch (csi.type)
{ {
case SettingInfo::Type::Boolean: case SettingInfo::Type::Boolean:
@ -1289,9 +1284,8 @@ bool InputManager::MapController(SettingsInterface& si, u32 controller,
return false; return false;
u32 num_mappings = 0; u32 num_mappings = 0;
for (u32 i = 0; i < info->num_bindings; i++) for (const Controller::ControllerBindingInfo& bi : info->bindings)
{ {
const Controller::ControllerBindingInfo& bi = info->bindings[i];
if (bi.generic_mapping == GenericInputBinding::Unknown) if (bi.generic_mapping == GenericInputBinding::Unknown)
continue; continue;
@ -1464,7 +1458,7 @@ void InputManager::LoadMacroButtonConfig(SettingsInterface& si, const std::strin
const Controller::ControllerInfo* cinfo) const Controller::ControllerInfo* cinfo)
{ {
s_macro_buttons[pad] = {}; s_macro_buttons[pad] = {};
if (cinfo->num_bindings == 0) if (cinfo->bindings.empty())
return; return;
for (u32 i = 0; i < NUM_MACRO_BUTTONS_PER_CONTROLLER; i++) for (u32 i = 0; i < NUM_MACRO_BUTTONS_PER_CONTROLLER; i++)
@ -1483,11 +1477,11 @@ void InputManager::LoadMacroButtonConfig(SettingsInterface& si, const std::strin
for (const std::string_view& button : buttons_split) for (const std::string_view& button : buttons_split)
{ {
const Controller::ControllerBindingInfo* binding = nullptr; const Controller::ControllerBindingInfo* binding = nullptr;
for (u32 j = 0; j < cinfo->num_bindings; j++) for (const Controller::ControllerBindingInfo& bi : cinfo->bindings)
{ {
if (button == cinfo->bindings[j].name) if (button == bi.name)
{ {
binding = &cinfo->bindings[j]; binding = &bi;
break; break;
} }
} }