chore: make yuzu REUSE compliant
[REUSE] is a specification that aims at making file copyright
information consistent, so that it can be both human and machine
readable. It basically requires that all files have a header containing
copyright and licensing information. When this isn't possible, like
when dealing with binary assets, generated files or embedded third-party
dependencies, it is permitted to insert copyright information in the
`.reuse/dep5` file.
Oh, and it also requires that all the licenses used in the project are
present in the `LICENSES` folder, that's why the diff is so huge.
This can be done automatically with `reuse download --all`.
The `reuse` tool also contains a handy subcommand that analyzes the
project and tells whether or not the project is (still) compliant,
`reuse lint`.
Following REUSE has a few advantages over the current approach:
- Copyright information is easy to access for users / downstream
- Files like `dist/license.md` do not need to exist anymore, as
`.reuse/dep5` is used instead
- `reuse lint` makes it easy to ensure that copyright information of
files like binary assets / images is always accurate and up to date
To add copyright information of files that didn't have it I looked up
who committed what and when, for each file. As yuzu contributors do not
have to sign a CLA or similar I couldn't assume that copyright ownership
was of the "yuzu Emulator Project", so I used the name and/or email of
the commit author instead.
[REUSE]: https://reuse.software
Follow-up to 01cf05bc75b1e47beb08937439f3ed9339e7b254
2022-05-15 02:06:02 +02:00
|
|
|
// SPDX-FileCopyrightText: 2016 Citra Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2016-07-29 14:45:49 +02:00
|
|
|
|
|
|
|
#include <memory>
|
2020-12-21 16:46:19 +01:00
|
|
|
#include <thread>
|
2018-11-27 11:00:56 +01:00
|
|
|
|
2023-08-23 03:58:23 +02:00
|
|
|
#include "common/settings.h"
|
2023-08-21 22:03:30 +02:00
|
|
|
#include "common/settings_enums.h"
|
2018-11-02 03:06:48 +01:00
|
|
|
#include "core/core.h"
|
2021-11-05 04:54:22 +01:00
|
|
|
#include "core/hid/emulated_controller.h"
|
|
|
|
#include "core/hid/hid_core.h"
|
2018-11-04 16:18:59 +01:00
|
|
|
#include "core/hle/service/am/am.h"
|
|
|
|
#include "core/hle/service/am/applet_ae.h"
|
|
|
|
#include "core/hle/service/am/applet_oe.h"
|
|
|
|
#include "core/hle/service/sm/sm.h"
|
2018-11-02 03:06:48 +01:00
|
|
|
#include "ui_configure_input.h"
|
2020-07-22 16:39:53 +02:00
|
|
|
#include "ui_configure_input_advanced.h"
|
2018-11-02 03:06:48 +01:00
|
|
|
#include "ui_configure_input_player.h"
|
2022-06-19 06:34:28 +02:00
|
|
|
#include "yuzu/configuration/configure_camera.h"
|
2020-07-22 16:39:53 +02:00
|
|
|
#include "yuzu/configuration/configure_debug_controller.h"
|
2018-01-12 04:33:56 +01:00
|
|
|
#include "yuzu/configuration/configure_input.h"
|
2020-07-22 16:39:53 +02:00
|
|
|
#include "yuzu/configuration/configure_input_advanced.h"
|
2018-11-02 03:06:48 +01:00
|
|
|
#include "yuzu/configuration/configure_input_player.h"
|
2020-07-14 19:01:36 +02:00
|
|
|
#include "yuzu/configuration/configure_motion_touch.h"
|
2022-01-09 06:23:40 +01:00
|
|
|
#include "yuzu/configuration/configure_ringcon.h"
|
2020-07-22 16:39:53 +02:00
|
|
|
#include "yuzu/configuration/configure_touchscreen_advanced.h"
|
2020-10-17 15:38:12 +02:00
|
|
|
#include "yuzu/configuration/configure_vibration.h"
|
2020-09-23 15:52:25 +02:00
|
|
|
#include "yuzu/configuration/input_profiles.h"
|
2020-07-22 16:39:53 +02:00
|
|
|
|
|
|
|
namespace {
|
|
|
|
template <typename Dialog, typename... Args>
|
|
|
|
void CallConfigureDialog(ConfigureInput& parent, Args&&... args) {
|
|
|
|
Dialog dialog(&parent, std::forward<Args>(args)...);
|
|
|
|
|
|
|
|
const auto res = dialog.exec();
|
|
|
|
if (res == QDialog::Accepted) {
|
|
|
|
dialog.ApplyConfiguration();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} // Anonymous namespace
|
2017-12-13 19:06:14 +01:00
|
|
|
|
2021-09-03 03:40:55 +02:00
|
|
|
void OnDockedModeChanged(bool last_state, bool new_state, Core::System& system) {
|
2018-12-05 04:01:01 +01:00
|
|
|
if (last_state == new_state) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!system.IsPoweredOn()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Service::SM::ServiceManager& sm = system.ServiceManager();
|
|
|
|
|
|
|
|
// Message queue is shared between these services, we just need to signal an operation
|
|
|
|
// change to one and it will handle both automatically
|
|
|
|
auto applet_oe = sm.GetService<Service::AM::AppletOE>("appletOE");
|
|
|
|
auto applet_ae = sm.GetService<Service::AM::AppletAE>("appletAE");
|
|
|
|
bool has_signalled = false;
|
|
|
|
|
|
|
|
if (applet_oe != nullptr) {
|
|
|
|
applet_oe->GetMessageQueue()->OperationModeChanged();
|
|
|
|
has_signalled = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (applet_ae != nullptr && !has_signalled) {
|
|
|
|
applet_ae->GetMessageQueue()->OperationModeChanged();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-03 03:40:55 +02:00
|
|
|
ConfigureInput::ConfigureInput(Core::System& system_, QWidget* parent)
|
2020-09-23 15:52:25 +02:00
|
|
|
: QWidget(parent), ui(std::make_unique<Ui::ConfigureInput>()),
|
2022-07-10 17:29:10 +02:00
|
|
|
profiles(std::make_unique<InputProfiles>()), system{system_} {
|
2016-07-29 14:45:49 +02:00
|
|
|
ui->setupUi(this);
|
2020-08-27 21:16:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
ConfigureInput::~ConfigureInput() = default;
|
2016-07-29 14:45:49 +02:00
|
|
|
|
2021-11-05 04:54:22 +01:00
|
|
|
void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,
|
2020-08-28 17:44:36 +02:00
|
|
|
std::size_t max_players) {
|
2021-11-05 04:54:22 +01:00
|
|
|
const bool is_powered_on = system.IsPoweredOn();
|
|
|
|
auto& hid_core = system.HIDCore();
|
2020-07-22 16:39:53 +02:00
|
|
|
player_controllers = {
|
2021-09-03 03:40:55 +02:00
|
|
|
new ConfigureInputPlayer(this, 0, ui->consoleInputSettings, input_subsystem, profiles.get(),
|
2021-11-05 04:54:22 +01:00
|
|
|
hid_core, is_powered_on),
|
2021-09-03 03:40:55 +02:00
|
|
|
new ConfigureInputPlayer(this, 1, ui->consoleInputSettings, input_subsystem, profiles.get(),
|
2021-11-05 04:54:22 +01:00
|
|
|
hid_core, is_powered_on),
|
2021-09-03 03:40:55 +02:00
|
|
|
new ConfigureInputPlayer(this, 2, ui->consoleInputSettings, input_subsystem, profiles.get(),
|
2021-11-05 04:54:22 +01:00
|
|
|
hid_core, is_powered_on),
|
2021-09-03 03:40:55 +02:00
|
|
|
new ConfigureInputPlayer(this, 3, ui->consoleInputSettings, input_subsystem, profiles.get(),
|
2021-11-05 04:54:22 +01:00
|
|
|
hid_core, is_powered_on),
|
2021-09-03 03:40:55 +02:00
|
|
|
new ConfigureInputPlayer(this, 4, ui->consoleInputSettings, input_subsystem, profiles.get(),
|
2021-11-05 04:54:22 +01:00
|
|
|
hid_core, is_powered_on),
|
2021-09-03 03:40:55 +02:00
|
|
|
new ConfigureInputPlayer(this, 5, ui->consoleInputSettings, input_subsystem, profiles.get(),
|
2021-11-05 04:54:22 +01:00
|
|
|
hid_core, is_powered_on),
|
2021-09-03 03:40:55 +02:00
|
|
|
new ConfigureInputPlayer(this, 6, ui->consoleInputSettings, input_subsystem, profiles.get(),
|
2021-11-05 04:54:22 +01:00
|
|
|
hid_core, is_powered_on),
|
2021-09-03 03:40:55 +02:00
|
|
|
new ConfigureInputPlayer(this, 7, ui->consoleInputSettings, input_subsystem, profiles.get(),
|
2021-11-05 04:54:22 +01:00
|
|
|
hid_core, is_powered_on),
|
2018-11-02 03:06:48 +01:00
|
|
|
};
|
2017-01-22 20:02:29 +01:00
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
player_tabs = {
|
|
|
|
ui->tabPlayer1, ui->tabPlayer2, ui->tabPlayer3, ui->tabPlayer4,
|
|
|
|
ui->tabPlayer5, ui->tabPlayer6, ui->tabPlayer7, ui->tabPlayer8,
|
2018-11-02 03:06:48 +01:00
|
|
|
};
|
2017-12-06 05:26:29 +01:00
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
player_connected = {
|
|
|
|
ui->checkboxPlayer1Connected, ui->checkboxPlayer2Connected, ui->checkboxPlayer3Connected,
|
|
|
|
ui->checkboxPlayer4Connected, ui->checkboxPlayer5Connected, ui->checkboxPlayer6Connected,
|
|
|
|
ui->checkboxPlayer7Connected, ui->checkboxPlayer8Connected,
|
|
|
|
};
|
2016-12-10 00:59:09 +01:00
|
|
|
|
2020-08-21 13:39:24 +02:00
|
|
|
std::array<QLabel*, 8> player_connected_labels = {
|
|
|
|
ui->label, ui->label_3, ui->label_4, ui->label_5,
|
|
|
|
ui->label_6, ui->label_7, ui->label_8, ui->label_9,
|
|
|
|
};
|
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
for (std::size_t i = 0; i < player_tabs.size(); ++i) {
|
|
|
|
player_tabs[i]->setLayout(new QHBoxLayout(player_tabs[i]));
|
|
|
|
player_tabs[i]->layout()->addWidget(player_controllers[i]);
|
|
|
|
connect(player_controllers[i], &ConfigureInputPlayer::Connected, [&, i](bool is_connected) {
|
2021-10-19 06:15:46 +02:00
|
|
|
// Ensures that the controllers are always connected in sequential order
|
2020-07-22 16:39:53 +02:00
|
|
|
if (is_connected) {
|
|
|
|
for (std::size_t index = 0; index <= i; ++index) {
|
|
|
|
player_connected[index]->setChecked(is_connected);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
for (std::size_t index = i; index < player_tabs.size(); ++index) {
|
|
|
|
player_connected[index]->setChecked(is_connected);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2020-10-29 17:15:35 +01:00
|
|
|
connect(player_controllers[i], &ConfigureInputPlayer::RefreshInputDevices, this,
|
|
|
|
&ConfigureInput::UpdateAllInputDevices);
|
|
|
|
connect(player_controllers[i], &ConfigureInputPlayer::RefreshInputProfiles, this,
|
|
|
|
&ConfigureInput::UpdateAllInputProfiles, Qt::QueuedConnection);
|
2020-08-15 21:26:29 +02:00
|
|
|
connect(player_connected[i], &QCheckBox::stateChanged, [this, i](int state) {
|
|
|
|
player_controllers[i]->ConnectPlayer(state == Qt::Checked);
|
|
|
|
});
|
2020-08-21 13:39:24 +02:00
|
|
|
|
|
|
|
// Remove/hide all the elements that exceed max_players, if applicable.
|
|
|
|
if (i >= max_players) {
|
|
|
|
ui->tabWidget->removeTab(static_cast<int>(max_players));
|
|
|
|
player_connected[i]->hide();
|
|
|
|
player_connected_labels[i]->hide();
|
|
|
|
}
|
2019-05-19 17:23:21 +02:00
|
|
|
}
|
2020-07-22 16:39:53 +02:00
|
|
|
// Only the first player can choose handheld mode so connect the signal just to player 1
|
|
|
|
connect(player_controllers[0], &ConfigureInputPlayer::HandheldStateChanged,
|
2020-08-15 21:26:29 +02:00
|
|
|
[this](bool is_handheld) { UpdateDockedState(is_handheld); });
|
2020-07-22 16:39:53 +02:00
|
|
|
|
|
|
|
advanced = new ConfigureInputAdvanced(this);
|
|
|
|
ui->tabAdvanced->setLayout(new QHBoxLayout(ui->tabAdvanced));
|
|
|
|
ui->tabAdvanced->layout()->addWidget(advanced);
|
2021-11-05 04:54:22 +01:00
|
|
|
|
2021-10-16 02:07:47 +02:00
|
|
|
connect(advanced, &ConfigureInputAdvanced::CallDebugControllerDialog,
|
2021-11-05 04:54:22 +01:00
|
|
|
[this, input_subsystem, &hid_core, is_powered_on] {
|
|
|
|
CallConfigureDialog<ConfigureDebugController>(
|
|
|
|
*this, input_subsystem, profiles.get(), hid_core, is_powered_on);
|
2021-10-16 02:07:47 +02:00
|
|
|
});
|
2020-07-22 16:39:53 +02:00
|
|
|
connect(advanced, &ConfigureInputAdvanced::CallTouchscreenConfigDialog,
|
2018-11-27 11:14:59 +01:00
|
|
|
[this] { CallConfigureDialog<ConfigureTouchscreenAdvanced>(*this); });
|
2020-08-29 20:56:51 +02:00
|
|
|
connect(advanced, &ConfigureInputAdvanced::CallMotionTouchConfigDialog,
|
|
|
|
[this, input_subsystem] {
|
|
|
|
CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem);
|
|
|
|
});
|
2022-01-09 06:23:40 +01:00
|
|
|
connect(advanced, &ConfigureInputAdvanced::CallRingControllerDialog,
|
|
|
|
[this, input_subsystem, &hid_core] {
|
|
|
|
CallConfigureDialog<ConfigureRingController>(*this, input_subsystem, hid_core);
|
|
|
|
});
|
2022-09-21 18:51:31 +02:00
|
|
|
connect(advanced, &ConfigureInputAdvanced::CallCameraDialog, [this, input_subsystem] {
|
|
|
|
CallConfigureDialog<ConfigureCamera>(*this, input_subsystem);
|
|
|
|
});
|
2020-07-22 16:39:53 +02:00
|
|
|
|
2020-10-17 15:38:12 +02:00
|
|
|
connect(ui->vibrationButton, &QPushButton::clicked,
|
2022-02-02 21:53:15 +01:00
|
|
|
[this, &hid_core] { CallConfigureDialog<ConfigureVibration>(*this, hid_core); });
|
2020-10-17 15:38:12 +02:00
|
|
|
|
2020-09-05 15:42:01 +02:00
|
|
|
connect(ui->motionButton, &QPushButton::clicked, [this, input_subsystem] {
|
|
|
|
CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem);
|
|
|
|
});
|
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
connect(ui->buttonClearAll, &QPushButton::clicked, [this] { ClearAll(); });
|
|
|
|
connect(ui->buttonRestoreDefaults, &QPushButton::clicked, [this] { RestoreDefaults(); });
|
|
|
|
|
|
|
|
RetranslateUI();
|
|
|
|
LoadConfiguration();
|
2018-08-26 10:23:12 +02:00
|
|
|
}
|
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
QList<QWidget*> ConfigureInput::GetSubTabs() const {
|
|
|
|
return {
|
|
|
|
ui->tabPlayer1, ui->tabPlayer2, ui->tabPlayer3, ui->tabPlayer4, ui->tabPlayer5,
|
|
|
|
ui->tabPlayer6, ui->tabPlayer7, ui->tabPlayer8, ui->tabAdvanced,
|
|
|
|
};
|
|
|
|
}
|
2018-11-04 16:18:59 +01:00
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
void ConfigureInput::ApplyConfiguration() {
|
2023-03-18 05:03:36 +01:00
|
|
|
const bool was_global = Settings::values.players.UsingGlobal();
|
|
|
|
Settings::values.players.SetGlobal(true);
|
2020-12-21 16:46:19 +01:00
|
|
|
for (auto* controller : player_controllers) {
|
2020-07-22 16:39:53 +02:00
|
|
|
controller->ApplyConfiguration();
|
2020-12-21 16:46:19 +01:00
|
|
|
}
|
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
advanced->ApplyConfiguration();
|
|
|
|
|
2023-08-23 03:58:23 +02:00
|
|
|
const bool pre_docked_mode = Settings::IsDockedMode();
|
|
|
|
const bool docked_mode_selected = ui->radioDocked->isChecked();
|
|
|
|
Settings::values.use_docked_mode.SetValue(
|
|
|
|
docked_mode_selected ? Settings::ConsoleMode::Docked : Settings::ConsoleMode::Handheld);
|
|
|
|
OnDockedModeChanged(pre_docked_mode, docked_mode_selected, system);
|
2020-07-22 16:39:53 +02:00
|
|
|
|
2020-09-28 16:00:15 +02:00
|
|
|
Settings::values.vibration_enabled.SetValue(ui->vibrationGroup->isChecked());
|
|
|
|
Settings::values.motion_enabled.SetValue(ui->motionGroup->isChecked());
|
2023-03-18 05:03:36 +01:00
|
|
|
Settings::values.players.SetGlobal(was_global);
|
2017-01-22 20:02:29 +01:00
|
|
|
}
|
2016-07-29 14:45:49 +02:00
|
|
|
|
2019-06-06 00:39:46 +02:00
|
|
|
void ConfigureInput::changeEvent(QEvent* event) {
|
|
|
|
if (event->type() == QEvent::LanguageChange) {
|
|
|
|
RetranslateUI();
|
|
|
|
}
|
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
QWidget::changeEvent(event);
|
2019-06-06 00:39:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void ConfigureInput::RetranslateUI() {
|
|
|
|
ui->retranslateUi(this);
|
|
|
|
}
|
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
void ConfigureInput::LoadConfiguration() {
|
2021-10-21 00:53:14 +02:00
|
|
|
const auto* handheld = system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld);
|
|
|
|
|
2019-06-06 00:39:46 +02:00
|
|
|
LoadPlayerControllerIndices();
|
2021-10-21 00:53:14 +02:00
|
|
|
UpdateDockedState(handheld->IsConnected());
|
2019-06-06 00:39:46 +02:00
|
|
|
|
2020-09-28 16:00:15 +02:00
|
|
|
ui->vibrationGroup->setChecked(Settings::values.vibration_enabled.GetValue());
|
|
|
|
ui->motionGroup->setChecked(Settings::values.motion_enabled.GetValue());
|
2020-07-22 16:39:53 +02:00
|
|
|
}
|
2016-07-29 14:45:49 +02:00
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
void ConfigureInput::LoadPlayerControllerIndices() {
|
|
|
|
for (std::size_t i = 0; i < player_connected.size(); ++i) {
|
2021-10-21 00:53:14 +02:00
|
|
|
if (i == 0) {
|
|
|
|
auto* handheld =
|
|
|
|
system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld);
|
|
|
|
if (handheld->IsConnected()) {
|
|
|
|
player_connected[i]->setChecked(true);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const auto* controller = system.HIDCore().GetEmulatedControllerByIndex(i);
|
|
|
|
player_connected[i]->setChecked(controller->IsConnected());
|
2018-11-04 16:18:59 +01:00
|
|
|
}
|
2020-07-22 16:39:53 +02:00
|
|
|
}
|
2018-11-04 16:18:59 +01:00
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
void ConfigureInput::ClearAll() {
|
|
|
|
// We don't have a good way to know what tab is active, but we can find out by getting the
|
|
|
|
// parent of the consoleInputSettings
|
2020-08-15 21:26:29 +02:00
|
|
|
auto* player_tab = static_cast<ConfigureInputPlayer*>(ui->consoleInputSettings->parent());
|
2020-07-22 16:39:53 +02:00
|
|
|
player_tab->ClearAll();
|
2016-07-29 14:45:49 +02:00
|
|
|
}
|
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
void ConfigureInput::RestoreDefaults() {
|
|
|
|
// We don't have a good way to know what tab is active, but we can find out by getting the
|
|
|
|
// parent of the consoleInputSettings
|
2020-08-15 21:26:29 +02:00
|
|
|
auto* player_tab = static_cast<ConfigureInputPlayer*>(ui->consoleInputSettings->parent());
|
2020-07-22 16:39:53 +02:00
|
|
|
player_tab->RestoreDefaults();
|
|
|
|
|
|
|
|
ui->radioDocked->setChecked(true);
|
|
|
|
ui->radioUndocked->setChecked(false);
|
|
|
|
ui->vibrationGroup->setChecked(true);
|
2020-09-05 15:42:01 +02:00
|
|
|
ui->motionGroup->setChecked(true);
|
2020-07-22 16:39:53 +02:00
|
|
|
}
|
2018-11-04 16:18:59 +01:00
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
void ConfigureInput::UpdateDockedState(bool is_handheld) {
|
2020-08-21 13:39:24 +02:00
|
|
|
// Disallow changing the console mode if the controller type is handheld.
|
2020-07-22 16:39:53 +02:00
|
|
|
ui->radioDocked->setEnabled(!is_handheld);
|
|
|
|
ui->radioUndocked->setEnabled(!is_handheld);
|
2016-12-10 00:59:09 +01:00
|
|
|
|
2023-08-23 03:58:23 +02:00
|
|
|
ui->radioDocked->setChecked(Settings::IsDockedMode());
|
|
|
|
ui->radioUndocked->setChecked(!Settings::IsDockedMode());
|
2017-12-06 05:26:29 +01:00
|
|
|
|
2020-08-21 13:39:24 +02:00
|
|
|
// Also force into undocked mode if the controller type is handheld.
|
2020-07-22 16:39:53 +02:00
|
|
|
if (is_handheld) {
|
|
|
|
ui->radioUndocked->setChecked(true);
|
2019-06-06 00:39:46 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-22 16:39:53 +02:00
|
|
|
void ConfigureInput::UpdateAllInputDevices() {
|
|
|
|
for (const auto& player : player_controllers) {
|
2020-09-17 18:00:29 +02:00
|
|
|
player->UpdateInputDeviceCombobox();
|
2017-12-06 05:26:29 +01:00
|
|
|
}
|
2016-07-29 14:45:49 +02:00
|
|
|
}
|
2020-10-29 17:15:35 +01:00
|
|
|
|
|
|
|
void ConfigureInput::UpdateAllInputProfiles(std::size_t player_index) {
|
|
|
|
for (std::size_t i = 0; i < player_controllers.size(); ++i) {
|
|
|
|
if (i == player_index) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
player_controllers[i]->UpdateInputProfiles();
|
|
|
|
}
|
|
|
|
}
|