diff options
-rw-r--r-- | src/core/hid/input_converter.cpp | 2 | ||||
-rw-r--r-- | src/input_common/drivers/sdl_driver.cpp | 5 | ||||
-rw-r--r-- | src/input_common/helpers/touch_from_buttons.cpp | 1 | ||||
-rw-r--r-- | src/yuzu/applets/qt_controller.cpp | 2 | ||||
-rw-r--r-- | src/yuzu/configuration/configure_input.cpp | 2 | ||||
-rw-r--r-- | src/yuzu/configuration/configure_input_player_widget.cpp | 89 | ||||
-rw-r--r-- | src/yuzu/configuration/configure_input_player_widget.h | 2 | ||||
-rw-r--r-- | src/yuzu/configuration/configure_vibration.cpp | 74 | ||||
-rw-r--r-- | src/yuzu/configuration/configure_vibration.h | 18 | ||||
-rw-r--r-- | src/yuzu/configuration/configure_vibration.ui | 7 | ||||
-rw-r--r-- | src/yuzu/main.cpp | 2 | ||||
-rw-r--r-- | src/yuzu_cmd/config.cpp | 36 |
12 files changed, 184 insertions, 56 deletions
diff --git a/src/core/hid/input_converter.cpp b/src/core/hid/input_converter.cpp index 860aab400..cd41607a7 100644 --- a/src/core/hid/input_converter.cpp +++ b/src/core/hid/input_converter.cpp @@ -28,7 +28,7 @@ Common::Input::BatteryStatus TransformToBattery(const Common::Input::CallbackSta if (value > 0.8f) { battery = Common::Input::BatteryLevel::Full; } - if (value >= 1.0f) { + if (value >= 0.95f) { battery = Common::Input::BatteryLevel::Charging; } break; diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index 577bf5c31..b031a8523 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -181,11 +181,10 @@ public: case SDL_JOYSTICK_POWER_EMPTY: return BatteryLevel::Empty; case SDL_JOYSTICK_POWER_LOW: - return BatteryLevel::Critical; - case SDL_JOYSTICK_POWER_MEDIUM: return BatteryLevel::Low; - case SDL_JOYSTICK_POWER_FULL: + case SDL_JOYSTICK_POWER_MEDIUM: return BatteryLevel::Medium; + case SDL_JOYSTICK_POWER_FULL: case SDL_JOYSTICK_POWER_MAX: return BatteryLevel::Full; case SDL_JOYSTICK_POWER_UNKNOWN: diff --git a/src/input_common/helpers/touch_from_buttons.cpp b/src/input_common/helpers/touch_from_buttons.cpp index ece1e3b32..f1b57d03a 100644 --- a/src/input_common/helpers/touch_from_buttons.cpp +++ b/src/input_common/helpers/touch_from_buttons.cpp @@ -4,7 +4,6 @@ #include <algorithm> #include "common/settings.h" -#include "core/frontend/framebuffer_layout.h" #include "input_common/helpers/touch_from_buttons.h" namespace InputCommon { diff --git a/src/yuzu/applets/qt_controller.cpp b/src/yuzu/applets/qt_controller.cpp index 4239c17f5..4104928d1 100644 --- a/src/yuzu/applets/qt_controller.cpp +++ b/src/yuzu/applets/qt_controller.cpp @@ -257,7 +257,7 @@ void QtControllerSelectorDialog::LoadConfiguration() { } void QtControllerSelectorDialog::CallConfigureVibrationDialog() { - ConfigureVibration dialog(this); + ConfigureVibration dialog(this, system.HIDCore()); dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp index d53179dbb..7c5776189 100644 --- a/src/yuzu/configuration/configure_input.cpp +++ b/src/yuzu/configuration/configure_input.cpp @@ -164,7 +164,7 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem, }); connect(ui->vibrationButton, &QPushButton::clicked, - [this] { CallConfigureDialog<ConfigureVibration>(*this); }); + [this, &hid_core] { CallConfigureDialog<ConfigureVibration>(*this, hid_core); }); connect(ui->motionButton, &QPushButton::clicked, [this, input_subsystem] { CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem); diff --git a/src/yuzu/configuration/configure_input_player_widget.cpp b/src/yuzu/configuration/configure_input_player_widget.cpp index 6630321cb..fb168b2ca 100644 --- a/src/yuzu/configuration/configure_input_player_widget.cpp +++ b/src/yuzu/configuration/configure_input_player_widget.cpp @@ -70,7 +70,6 @@ void PlayerControlPreview::UpdateColors() { colors.slider_arrow = QColor(14, 15, 18); colors.font2 = QColor(255, 255, 255); colors.indicator = QColor(170, 238, 255); - colors.indicator2 = QColor(100, 255, 100); colors.deadzone = QColor(204, 136, 136); colors.slider_button = colors.button; } @@ -88,7 +87,6 @@ void PlayerControlPreview::UpdateColors() { colors.slider_arrow = QColor(65, 68, 73); colors.font2 = QColor(0, 0, 0); colors.indicator = QColor(0, 0, 200); - colors.indicator2 = QColor(0, 150, 0); colors.deadzone = QColor(170, 0, 0); colors.slider_button = QColor(153, 149, 149); } @@ -101,6 +99,8 @@ void PlayerControlPreview::UpdateColors() { colors.font = QColor(255, 255, 255); colors.led_on = QColor(255, 255, 0); colors.led_off = QColor(170, 238, 255); + colors.indicator2 = QColor(59, 165, 93); + colors.charging = QColor(250, 168, 26); colors.left = colors.primary; colors.right = colors.primary; @@ -357,7 +357,7 @@ void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center) DrawCircle(p, center + QPoint(26, 71), 5); // Draw battery - DrawBattery(p, center + QPoint(-170, -140), + DrawBattery(p, center + QPoint(-160, -140), battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]); } @@ -484,7 +484,7 @@ void PlayerControlPreview::DrawRightController(QPainter& p, const QPointF center DrawSymbol(p, center + QPoint(-26, 66), Symbol::House, 5); // Draw battery - DrawBattery(p, center + QPoint(110, -140), + DrawBattery(p, center + QPoint(120, -140), battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]); } @@ -621,9 +621,9 @@ void PlayerControlPreview::DrawDualController(QPainter& p, const QPointF center) DrawSymbol(p, center + QPoint(50, 60), Symbol::House, 4.2f); // Draw battery - DrawBattery(p, center + QPoint(-100, -160), + DrawBattery(p, center + QPoint(-200, -10), battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]); - DrawBattery(p, center + QPoint(40, -160), + DrawBattery(p, center + QPoint(160, -10), battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]); } @@ -694,12 +694,12 @@ void PlayerControlPreview::DrawHandheldController(QPainter& p, const QPointF cen // ZL and ZR buttons p.setPen(colors.outline); - DrawTriggerButton(p, center + QPoint(-210, -130), Direction::Left, button_values[ZL]); - DrawTriggerButton(p, center + QPoint(210, -130), Direction::Right, button_values[ZR]); + DrawTriggerButton(p, center + QPoint(-210, -120), Direction::Left, button_values[ZL]); + DrawTriggerButton(p, center + QPoint(210, -120), Direction::Right, button_values[ZR]); p.setPen(colors.transparent); p.setBrush(colors.font); - DrawSymbol(p, center + QPoint(-210, -130), Symbol::ZL, 1.5f); - DrawSymbol(p, center + QPoint(210, -130), Symbol::ZR, 1.5f); + DrawSymbol(p, center + QPoint(-210, -120), Symbol::ZL, 1.5f); + DrawSymbol(p, center + QPoint(210, -120), Symbol::ZR, 1.5f); // Minus and Plus button p.setPen(colors.outline); @@ -725,9 +725,9 @@ void PlayerControlPreview::DrawHandheldController(QPainter& p, const QPointF cen DrawSymbol(p, center + QPoint(161, 37), Symbol::House, 2.75f); // Draw battery - DrawBattery(p, center + QPoint(-200, 110), + DrawBattery(p, center + QPoint(-188, 95), battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]); - DrawBattery(p, center + QPoint(130, 110), + DrawBattery(p, center + QPoint(150, 95), battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]); } @@ -781,12 +781,12 @@ void PlayerControlPreview::DrawProController(QPainter& p, const QPointF center) // ZL and ZR buttons p.setPen(colors.outline); - DrawTriggerButton(p, center + QPoint(-210, -130), Direction::Left, button_values[ZL]); - DrawTriggerButton(p, center + QPoint(210, -130), Direction::Right, button_values[ZR]); + DrawTriggerButton(p, center + QPoint(-210, -120), Direction::Left, button_values[ZL]); + DrawTriggerButton(p, center + QPoint(210, -120), Direction::Right, button_values[ZR]); p.setPen(colors.transparent); p.setBrush(colors.font); - DrawSymbol(p, center + QPoint(-210, -130), Symbol::ZL, 1.5f); - DrawSymbol(p, center + QPoint(210, -130), Symbol::ZR, 1.5f); + DrawSymbol(p, center + QPoint(-210, -120), Symbol::ZL, 1.5f); + DrawSymbol(p, center + QPoint(210, -120), Symbol::ZR, 1.5f); // Minus and Plus buttons p.setPen(colors.outline); @@ -818,7 +818,7 @@ void PlayerControlPreview::DrawProController(QPainter& p, const QPointF center) DrawSymbol(p, center + QPoint(29, -56), Symbol::House, 3.9f); // Draw battery - DrawBattery(p, center + QPoint(-30, -160), + DrawBattery(p, center + QPoint(-20, -160), battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]); } @@ -875,7 +875,7 @@ void PlayerControlPreview::DrawGCController(QPainter& p, const QPointF center) { DrawCircleButton(p, center + QPoint(0, -44), button_values[Plus], 8); // Draw battery - DrawBattery(p, center + QPoint(-30, -165), + DrawBattery(p, center + QPoint(-20, 110), battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]); } @@ -1030,6 +1030,10 @@ constexpr std::array<float, 30 * 2> symbol_c = { -2.37f, 5.64f, -0.65f, 6.44f, 1.25f, 6.47f, 3.06f, 5.89f, 4.63f, 4.92f, 4.63f, 6.83f, }; +constexpr std::array<float, 6 * 2> symbol_charging = { + 6.5f, -1.0f, 1.0f, -1.0f, 1.0f, -3.0f, -6.5f, 1.0f, -1.0f, 1.0f, -1.0f, 3.0f, +}; + constexpr std::array<float, 12 * 2> house = { -1.3f, 0.0f, -0.93f, 0.0f, -0.93f, 1.15f, 0.93f, 1.15f, 0.93f, 0.0f, 1.3f, 0.0f, 0.0f, -1.2f, -1.3f, 0.0f, -0.43f, 0.0f, -0.43f, .73f, 0.43f, .73f, 0.43f, 0.0f, @@ -2674,36 +2678,43 @@ void PlayerControlPreview::DrawBattery(QPainter& p, QPointF center, if (battery == Common::Input::BatteryLevel::None) { return; } - p.setPen(colors.outline); + // Draw outline + p.setPen(QPen(colors.button, 5)); + p.setBrush(colors.transparent); + p.drawRoundedRect(center.x(), center.y(), 34, 16, 2, 2); + + p.setPen(QPen(colors.button, 3)); + p.drawRect(center.x() + 35, center.y() + 4.5f, 4, 7); + + // Draw Battery shape + p.setPen(QPen(colors.indicator2, 3)); p.setBrush(colors.transparent); - p.drawRect(center.x(), center.y(), 56, 20); - p.drawRect(center.x() + 56, center.y() + 6, 3, 8); - p.setBrush(colors.deadzone); + p.drawRoundedRect(center.x(), center.y(), 34, 16, 2, 2); + + p.setPen(QPen(colors.indicator2, 1)); + p.setBrush(colors.indicator2); + p.drawRect(center.x() + 35, center.y() + 4.5f, 4, 7); switch (battery) { case Common::Input::BatteryLevel::Charging: - p.setBrush(colors.indicator2); - p.drawText(center + QPoint(2, 14), tr("Charging")); + p.drawRect(center.x(), center.y(), 34, 16); + p.setPen(colors.slider); + p.setBrush(colors.charging); + DrawSymbol(p, center + QPointF(17.0f, 8.0f), Symbol::Charging, 2.1f); break; case Common::Input::BatteryLevel::Full: - p.drawRect(center.x() + 42, center.y(), 14, 20); - p.drawRect(center.x() + 28, center.y(), 14, 20); - p.drawRect(center.x() + 14, center.y(), 14, 20); - p.drawRect(center.x(), center.y(), 14, 20); + p.drawRect(center.x(), center.y(), 34, 16); break; case Common::Input::BatteryLevel::Medium: - p.drawRect(center.x() + 28, center.y(), 14, 20); - p.drawRect(center.x() + 14, center.y(), 14, 20); - p.drawRect(center.x(), center.y(), 14, 20); + p.drawRect(center.x(), center.y(), 25, 16); break; case Common::Input::BatteryLevel::Low: - p.drawRect(center.x() + 14, center.y(), 14, 20); - p.drawRect(center.x(), center.y(), 14, 20); + p.drawRect(center.x(), center.y(), 17, 16); break; case Common::Input::BatteryLevel::Critical: - p.drawRect(center.x(), center.y(), 14, 20); + p.drawRect(center.x(), center.y(), 6, 16); break; case Common::Input::BatteryLevel::Empty: - p.drawRect(center.x(), center.y(), 5, 20); + p.drawRect(center.x(), center.y(), 3, 16); break; default: break; @@ -2724,6 +2735,7 @@ void PlayerControlPreview::DrawSymbol(QPainter& p, const QPointF center, Symbol std::array<QPointF, symbol_sl.size() / 2> sl_icon; std::array<QPointF, symbol_zr.size() / 2> zr_icon; std::array<QPointF, symbol_sr.size() / 2> sr_icon; + std::array<QPointF, symbol_charging.size() / 2> charging_icon; switch (symbol) { case Symbol::House: for (std::size_t point = 0; point < house.size() / 2; ++point) { @@ -2809,6 +2821,13 @@ void PlayerControlPreview::DrawSymbol(QPainter& p, const QPointF center, Symbol } p.drawPolygon(sr_icon.data(), static_cast<int>(sr_icon.size())); break; + case Symbol::Charging: + for (std::size_t point = 0; point < symbol_charging.size() / 2; ++point) { + charging_icon[point] = center + QPointF(symbol_charging[point * 2] * icon_size, + symbol_charging[point * 2 + 1] * icon_size); + } + p.drawPolygon(charging_icon.data(), static_cast<int>(charging_icon.size())); + break; } } diff --git a/src/yuzu/configuration/configure_input_player_widget.h b/src/yuzu/configuration/configure_input_player_widget.h index 4cd5c3be0..3582ef77a 100644 --- a/src/yuzu/configuration/configure_input_player_widget.h +++ b/src/yuzu/configuration/configure_input_player_widget.h @@ -72,6 +72,7 @@ private: ZL, ZR, SR, + Charging, }; struct ColorMapping { @@ -94,6 +95,7 @@ private: QColor slider_button{}; QColor slider_arrow{}; QColor deadzone{}; + QColor charging{}; }; void UpdateColors(); diff --git a/src/yuzu/configuration/configure_vibration.cpp b/src/yuzu/configuration/configure_vibration.cpp index adce04b27..779b6401c 100644 --- a/src/yuzu/configuration/configure_vibration.cpp +++ b/src/yuzu/configuration/configure_vibration.cpp @@ -9,11 +9,14 @@ #include "common/param_package.h" #include "common/settings.h" +#include "core/hid/emulated_controller.h" +#include "core/hid/hid_core.h" +#include "core/hid/hid_types.h" #include "ui_configure_vibration.h" #include "yuzu/configuration/configure_vibration.h" -ConfigureVibration::ConfigureVibration(QWidget* parent) - : QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()) { +ConfigureVibration::ConfigureVibration(QWidget* parent, Core::HID::HIDCore& hid_core_) + : QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()), hid_core{hid_core_} { ui->setupUi(this); vibration_groupboxes = { @@ -31,6 +34,13 @@ ConfigureVibration::ConfigureVibration(QWidget* parent) const auto& players = Settings::values.players.GetValue(); for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { + auto controller = hid_core.GetEmulatedControllerByIndex(i); + Core::HID::ControllerUpdateCallback engine_callback{ + .on_change = [this, + i](Core::HID::ControllerTriggerType type) { VibrateController(type, i); }, + .is_npad_service = false, + }; + controller_callback_key[i] = controller->SetCallback(engine_callback); vibration_groupboxes[i]->setChecked(players[i].vibration_enabled); vibration_spinboxes[i]->setValue(players[i].vibration_strength); } @@ -45,7 +55,14 @@ ConfigureVibration::ConfigureVibration(QWidget* parent) RetranslateUI(); } -ConfigureVibration::~ConfigureVibration() = default; +ConfigureVibration::~ConfigureVibration() { + StopVibrations(); + + for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { + auto controller = hid_core.GetEmulatedControllerByIndex(i); + controller->DeleteCallback(controller_callback_key[i]); + } +}; void ConfigureVibration::ApplyConfiguration() { auto& players = Settings::values.players.GetValue(); @@ -70,3 +87,54 @@ void ConfigureVibration::changeEvent(QEvent* event) { void ConfigureVibration::RetranslateUI() { ui->retranslateUi(this); } + +void ConfigureVibration::VibrateController(Core::HID::ControllerTriggerType type, + std::size_t player_index) { + if (type != Core::HID::ControllerTriggerType::Button) { + return; + } + + auto& player = Settings::values.players.GetValue()[player_index]; + auto controller = hid_core.GetEmulatedControllerByIndex(player_index); + const int vibration_strenght = vibration_spinboxes[player_index]->value(); + const auto& buttons = controller->GetButtonsValues(); + + bool button_is_pressed = false; + for (std::size_t i = 0; i < buttons.size(); ++i) { + if (buttons[i].value) { + button_is_pressed = true; + break; + } + } + + if (!button_is_pressed) { + StopVibrations(); + return; + } + + const int old_vibration_enabled = player.vibration_enabled; + const bool old_vibration_strenght = player.vibration_strength; + player.vibration_enabled = true; + player.vibration_strength = vibration_strenght; + + const Core::HID::VibrationValue vibration{ + .low_amplitude = 1.0f, + .low_frequency = 160.0f, + .high_amplitude = 1.0f, + .high_frequency = 320.0f, + }; + controller->SetVibration(0, vibration); + controller->SetVibration(1, vibration); + + // Restore previous values + player.vibration_enabled = old_vibration_enabled; + player.vibration_strength = old_vibration_strenght; +} + +void ConfigureVibration::StopVibrations() { + for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { + auto controller = hid_core.GetEmulatedControllerByIndex(i); + controller->SetVibration(0, Core::HID::DEFAULT_VIBRATION_VALUE); + controller->SetVibration(1, Core::HID::DEFAULT_VIBRATION_VALUE); + } +} diff --git a/src/yuzu/configuration/configure_vibration.h b/src/yuzu/configuration/configure_vibration.h index 37bbc2653..50b8195fa 100644 --- a/src/yuzu/configuration/configure_vibration.h +++ b/src/yuzu/configuration/configure_vibration.h @@ -15,11 +15,16 @@ namespace Ui { class ConfigureVibration; } +namespace Core::HID { +enum class ControllerTriggerType; +class HIDCore; +} // namespace Core::HID + class ConfigureVibration : public QDialog { Q_OBJECT public: - explicit ConfigureVibration(QWidget* parent); + explicit ConfigureVibration(QWidget* parent, Core::HID::HIDCore& hid_core_); ~ConfigureVibration() override; void ApplyConfiguration(); @@ -27,14 +32,21 @@ public: private: void changeEvent(QEvent* event) override; void RetranslateUI(); + void VibrateController(Core::HID::ControllerTriggerType type, std::size_t player_index); + void StopVibrations(); std::unique_ptr<Ui::ConfigureVibration> ui; static constexpr std::size_t NUM_PLAYERS = 8; - // Groupboxes encapsulating the vibration strength spinbox. + /// Groupboxes encapsulating the vibration strength spinbox. std::array<QGroupBox*, NUM_PLAYERS> vibration_groupboxes; - // Spinboxes representing the vibration strength percentage. + /// Spinboxes representing the vibration strength percentage. std::array<QSpinBox*, NUM_PLAYERS> vibration_spinboxes; + + /// Callback index to stop the controllers events + std::array<int, NUM_PLAYERS> controller_callback_key; + + Core::HID::HIDCore& hid_core; }; diff --git a/src/yuzu/configuration/configure_vibration.ui b/src/yuzu/configuration/configure_vibration.ui index efdf317a9..447a18eb1 100644 --- a/src/yuzu/configuration/configure_vibration.ui +++ b/src/yuzu/configuration/configure_vibration.ui @@ -17,6 +17,13 @@ <string notr="true"/> </property> <layout class="QVBoxLayout"> + <item row="0" column="0" colspan="4"> + <widget class="QLabel" name="label_1"> + <property name="text"> + <string>Press any controller button to vibrate the controller.</string> + </property> + </widget> + </item> <item> <widget class="QGroupBox" name="vibrationStrengthGroup"> <property name="title"> diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 556d2cdb3..c788db12d 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -1052,8 +1052,10 @@ void GMainWindow::SetDefaultUIGeometry() { } void GMainWindow::RestoreUIState() { + setWindowFlags(windowFlags() & ~Qt::FramelessWindowHint); restoreGeometry(UISettings::values.geometry); restoreState(UISettings::values.state); + render_window->setWindowFlags(render_window->windowFlags() & ~Qt::FramelessWindowHint); render_window->restoreGeometry(UISettings::values.renderwindow_geometry); #if MICROPROFILE_ENABLED microProfileDialog->restoreGeometry(UISettings::values.microprofile_geometry); diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp index 8e9c7d211..ff616da70 100644 --- a/src/yuzu_cmd/config.cpp +++ b/src/yuzu_cmd/config.cpp @@ -66,6 +66,11 @@ static const std::array<int, Settings::NativeButton::NumButtons> default_buttons SDL_SCANCODE_M, SDL_SCANCODE_N, SDL_SCANCODE_1, SDL_SCANCODE_2, SDL_SCANCODE_B, }; +static const std::array<int, Settings::NativeMotion::NumMotions> default_motions = { + SDL_SCANCODE_7, + SDL_SCANCODE_8, +}; + static const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> default_analogs{{ { SDL_SCANCODE_UP, @@ -102,27 +107,42 @@ void Config::ReadSetting(const std::string& group, Settings::BasicSetting<Type>& void Config::ReadValues() { // Controls for (std::size_t p = 0; p < Settings::values.players.GetValue().size(); ++p) { + auto& player = Settings::values.players.GetValue()[p]; + const auto group = fmt::format("ControlsP{}", p); for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]); - Settings::values.players.GetValue()[p].buttons[i] = + player.buttons[i] = sdl2_config->Get(group, Settings::NativeButton::mapping[i], default_param); - if (Settings::values.players.GetValue()[p].buttons[i].empty()) - Settings::values.players.GetValue()[p].buttons[i] = default_param; + if (player.buttons[i].empty()) { + player.buttons[i] = default_param; + } } for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { std::string default_param = InputCommon::GenerateAnalogParamFromKeys( default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], default_analogs[i][3], default_analogs[i][4], 0.5f); - Settings::values.players.GetValue()[p].analogs[i] = + player.analogs[i] = sdl2_config->Get(group, Settings::NativeAnalog::mapping[i], default_param); - if (Settings::values.players.GetValue()[p].analogs[i].empty()) - Settings::values.players.GetValue()[p].analogs[i] = default_param; + if (player.analogs[i].empty()) { + player.analogs[i] = default_param; + } + } + + for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) { + const std::string default_param = + InputCommon::GenerateKeyboardParam(default_motions[i]); + auto& player_motions = player.motions[i]; + + player_motions = + sdl2_config->Get(group, Settings::NativeMotion::mapping[i], default_param); + if (player_motions.empty()) { + player_motions = default_param; + } } - Settings::values.players.GetValue()[p].connected = - sdl2_config->GetBoolean(group, "connected", false); + player.connected = sdl2_config->GetBoolean(group, "connected", false); } ReadSetting("ControlsGeneral", Settings::values.mouse_enabled); |