diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/common/settings.h | 2 | ||||
| -rw-r--r-- | src/core/hid/emulated_controller.cpp | 78 | ||||
| -rw-r--r-- | src/core/hid/emulated_controller.h | 7 | ||||
| -rw-r--r-- | src/core/hid/hid_types.h | 26 | ||||
| -rw-r--r-- | src/yuzu/applets/qt_controller.cpp | 9 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 7 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_per_game.cpp | 5 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player.cpp | 8 |
8 files changed, 104 insertions, 38 deletions
diff --git a/src/common/settings.h b/src/common/settings.h index 6d27dd5ee..9fe764e86 100644 --- a/src/common/settings.h +++ b/src/common/settings.h | |||
| @@ -481,7 +481,7 @@ struct Values { | |||
| 481 | SwitchableSetting<s32, true> sound_index{1, 0, 2, "sound_index"}; | 481 | SwitchableSetting<s32, true> sound_index{1, 0, 2, "sound_index"}; |
| 482 | 482 | ||
| 483 | // Controls | 483 | // Controls |
| 484 | InputSetting<std::array<PlayerInput, 10>> players; | 484 | InputSetting<std::array<PlayerInput, 8>> players; |
| 485 | 485 | ||
| 486 | SwitchableSetting<bool> use_docked_mode{true, "use_docked_mode"}; | 486 | SwitchableSetting<bool> use_docked_mode{true, "use_docked_mode"}; |
| 487 | 487 | ||
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp index a29c9a6f8..9f0ceca49 100644 --- a/src/core/hid/emulated_controller.cpp +++ b/src/core/hid/emulated_controller.cpp | |||
| @@ -82,7 +82,12 @@ Settings::ControllerType EmulatedController::MapNPadToSettingsType(NpadStyleInde | |||
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | void EmulatedController::ReloadFromSettings() { | 84 | void EmulatedController::ReloadFromSettings() { |
| 85 | const auto player_index = NpadIdTypeToIndex(npad_id_type); | 85 | if (npad_id_type == NpadIdType::Other) { |
| 86 | ReloadDebugPadFromSettings(); | ||
| 87 | return; | ||
| 88 | } | ||
| 89 | |||
| 90 | const auto player_index = NpadIdTypeToConfigIndex(npad_id_type); | ||
| 86 | const auto& player = Settings::values.players.GetValue()[player_index]; | 91 | const auto& player = Settings::values.players.GetValue()[player_index]; |
| 87 | 92 | ||
| 88 | for (std::size_t index = 0; index < player.buttons.size(); ++index) { | 93 | for (std::size_t index = 0; index < player.buttons.size(); ++index) { |
| @@ -111,13 +116,21 @@ void EmulatedController::ReloadFromSettings() { | |||
| 111 | 116 | ||
| 112 | ring_params[0] = Common::ParamPackage(Settings::values.ringcon_analogs); | 117 | ring_params[0] = Common::ParamPackage(Settings::values.ringcon_analogs); |
| 113 | 118 | ||
| 114 | // Other or debug controller should always be a pro controller | 119 | SetNpadStyleIndex(MapSettingsTypeToNPad(player.controller_type)); |
| 115 | if (npad_id_type != NpadIdType::Other) { | 120 | original_npad_type = npad_type; |
| 116 | SetNpadStyleIndex(MapSettingsTypeToNPad(player.controller_type)); | 121 | |
| 117 | original_npad_type = npad_type; | 122 | // Player 1 shares config with handheld. Disable controller when handheld is selected |
| 118 | } else { | 123 | if (npad_id_type == NpadIdType::Player1 && npad_type == NpadStyleIndex::Handheld) { |
| 119 | SetNpadStyleIndex(NpadStyleIndex::ProController); | 124 | Disconnect(); |
| 120 | original_npad_type = npad_type; | 125 | ReloadInput(); |
| 126 | return; | ||
| 127 | } | ||
| 128 | |||
| 129 | // Handheld shares config with player 1. Disable controller when handheld isn't selected | ||
| 130 | if (npad_id_type == NpadIdType::Handheld && npad_type != NpadStyleIndex::Handheld) { | ||
| 131 | Disconnect(); | ||
| 132 | ReloadInput(); | ||
| 133 | return; | ||
| 121 | } | 134 | } |
| 122 | 135 | ||
| 123 | Disconnect(); | 136 | Disconnect(); |
| @@ -128,6 +141,33 @@ void EmulatedController::ReloadFromSettings() { | |||
| 128 | ReloadInput(); | 141 | ReloadInput(); |
| 129 | } | 142 | } |
| 130 | 143 | ||
| 144 | void EmulatedController::ReloadDebugPadFromSettings() { | ||
| 145 | for (std::size_t index = 0; index < Settings::values.debug_pad_buttons.size(); ++index) { | ||
| 146 | button_params[index] = Common::ParamPackage(Settings::values.debug_pad_buttons[index]); | ||
| 147 | } | ||
| 148 | for (std::size_t index = 0; index < Settings::values.debug_pad_analogs.size(); ++index) { | ||
| 149 | stick_params[index] = Common::ParamPackage(Settings::values.debug_pad_analogs[index]); | ||
| 150 | } | ||
| 151 | for (std::size_t index = 0; index < motion_params.size(); ++index) { | ||
| 152 | motion_params[index] = {}; | ||
| 153 | } | ||
| 154 | |||
| 155 | controller.color_values = {}; | ||
| 156 | controller.colors_state.fullkey = {}; | ||
| 157 | controller.colors_state.left = {}; | ||
| 158 | controller.colors_state.right = {}; | ||
| 159 | ring_params[0] = {}; | ||
| 160 | SetNpadStyleIndex(NpadStyleIndex::ProController); | ||
| 161 | original_npad_type = npad_type; | ||
| 162 | |||
| 163 | Disconnect(); | ||
| 164 | if (Settings::values.debug_pad_enabled) { | ||
| 165 | Connect(); | ||
| 166 | } | ||
| 167 | |||
| 168 | ReloadInput(); | ||
| 169 | } | ||
| 170 | |||
| 131 | void EmulatedController::LoadDevices() { | 171 | void EmulatedController::LoadDevices() { |
| 132 | // TODO(german77): Use more buttons to detect the correct device | 172 | // TODO(german77): Use more buttons to detect the correct device |
| 133 | const auto left_joycon = button_params[Settings::NativeButton::DRight]; | 173 | const auto left_joycon = button_params[Settings::NativeButton::DRight]; |
| @@ -560,9 +600,23 @@ bool EmulatedController::IsConfiguring() const { | |||
| 560 | } | 600 | } |
| 561 | 601 | ||
| 562 | void EmulatedController::SaveCurrentConfig() { | 602 | void EmulatedController::SaveCurrentConfig() { |
| 563 | const auto player_index = NpadIdTypeToIndex(npad_id_type); | 603 | // Other can't alter the config from here |
| 604 | if (npad_id_type == NpadIdType::Other) { | ||
| 605 | return; | ||
| 606 | } | ||
| 607 | |||
| 608 | const auto player_index = NpadIdTypeToConfigIndex(npad_id_type); | ||
| 564 | auto& player = Settings::values.players.GetValue()[player_index]; | 609 | auto& player = Settings::values.players.GetValue()[player_index]; |
| 565 | player.connected = is_connected; | 610 | |
| 611 | // Only save the connected status when handheld is connected | ||
| 612 | if (npad_id_type == NpadIdType::Handheld && npad_type == NpadStyleIndex::Handheld) { | ||
| 613 | player.connected = is_connected; | ||
| 614 | } | ||
| 615 | |||
| 616 | if (npad_id_type != NpadIdType::Handheld && npad_type != NpadStyleIndex::Handheld) { | ||
| 617 | player.connected = is_connected; | ||
| 618 | } | ||
| 619 | |||
| 566 | player.controller_type = MapNPadToSettingsType(npad_type); | 620 | player.controller_type = MapNPadToSettingsType(npad_type); |
| 567 | for (std::size_t index = 0; index < player.buttons.size(); ++index) { | 621 | for (std::size_t index = 0; index < player.buttons.size(); ++index) { |
| 568 | player.buttons[index] = button_params[index].Serialize(); | 622 | player.buttons[index] = button_params[index].Serialize(); |
| @@ -1152,7 +1206,7 @@ bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue v | |||
| 1152 | if (!output_devices[device_index]) { | 1206 | if (!output_devices[device_index]) { |
| 1153 | return false; | 1207 | return false; |
| 1154 | } | 1208 | } |
| 1155 | const auto player_index = NpadIdTypeToIndex(npad_id_type); | 1209 | const auto player_index = NpadIdTypeToConfigIndex(npad_id_type); |
| 1156 | const auto& player = Settings::values.players.GetValue()[player_index]; | 1210 | const auto& player = Settings::values.players.GetValue()[player_index]; |
| 1157 | const f32 strength = static_cast<f32>(player.vibration_strength) / 100.0f; | 1211 | const f32 strength = static_cast<f32>(player.vibration_strength) / 100.0f; |
| 1158 | 1212 | ||
| @@ -1178,7 +1232,7 @@ bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue v | |||
| 1178 | } | 1232 | } |
| 1179 | 1233 | ||
| 1180 | bool EmulatedController::IsVibrationEnabled(std::size_t device_index) { | 1234 | bool EmulatedController::IsVibrationEnabled(std::size_t device_index) { |
| 1181 | const auto player_index = NpadIdTypeToIndex(npad_id_type); | 1235 | const auto player_index = NpadIdTypeToConfigIndex(npad_id_type); |
| 1182 | const auto& player = Settings::values.players.GetValue()[player_index]; | 1236 | const auto& player = Settings::values.players.GetValue()[player_index]; |
| 1183 | 1237 | ||
| 1184 | if (!player.vibration_enabled) { | 1238 | if (!player.vibration_enabled) { |
diff --git a/src/core/hid/emulated_controller.h b/src/core/hid/emulated_controller.h index a9da465a2..99572b3bd 100644 --- a/src/core/hid/emulated_controller.h +++ b/src/core/hid/emulated_controller.h | |||
| @@ -250,9 +250,14 @@ public: | |||
| 250 | /// Reload all input devices | 250 | /// Reload all input devices |
| 251 | void ReloadInput(); | 251 | void ReloadInput(); |
| 252 | 252 | ||
| 253 | /// Overrides current mapped devices with the stored configuration and reloads all input devices | 253 | /// Overrides current mapped devices with the stored configuration and reloads all input |
| 254 | /// callbacks | ||
| 254 | void ReloadFromSettings(); | 255 | void ReloadFromSettings(); |
| 255 | 256 | ||
| 257 | /// Overrides current mapped debug pad with the stored configuration and reloads all input | ||
| 258 | /// callbacks | ||
| 259 | void ReloadDebugPadFromSettings(); | ||
| 260 | |||
| 256 | /// Saves the current mapped configuration | 261 | /// Saves the current mapped configuration |
| 257 | void SaveCurrentConfig(); | 262 | void SaveCurrentConfig(); |
| 258 | 263 | ||
diff --git a/src/core/hid/hid_types.h b/src/core/hid/hid_types.h index 6b35f448c..983f0addd 100644 --- a/src/core/hid/hid_types.h +++ b/src/core/hid/hid_types.h | |||
| @@ -690,6 +690,32 @@ constexpr size_t NpadIdTypeToIndex(NpadIdType npad_id_type) { | |||
| 690 | } | 690 | } |
| 691 | } | 691 | } |
| 692 | 692 | ||
| 693 | /// Converts a NpadIdType to a config array index. | ||
| 694 | constexpr size_t NpadIdTypeToConfigIndex(NpadIdType npad_id_type) { | ||
| 695 | switch (npad_id_type) { | ||
| 696 | case NpadIdType::Player1: | ||
| 697 | return 0; | ||
| 698 | case NpadIdType::Player2: | ||
| 699 | return 1; | ||
| 700 | case NpadIdType::Player3: | ||
| 701 | return 2; | ||
| 702 | case NpadIdType::Player4: | ||
| 703 | return 3; | ||
| 704 | case NpadIdType::Player5: | ||
| 705 | return 4; | ||
| 706 | case NpadIdType::Player6: | ||
| 707 | return 5; | ||
| 708 | case NpadIdType::Player7: | ||
| 709 | return 6; | ||
| 710 | case NpadIdType::Player8: | ||
| 711 | return 7; | ||
| 712 | case NpadIdType::Other: | ||
| 713 | case NpadIdType::Handheld: | ||
| 714 | default: | ||
| 715 | return 0; | ||
| 716 | } | ||
| 717 | } | ||
| 718 | |||
| 693 | /// Converts an array index to a NpadIdType | 719 | /// Converts an array index to a NpadIdType |
| 694 | constexpr NpadIdType IndexToNpadIdType(size_t index) { | 720 | constexpr NpadIdType IndexToNpadIdType(size_t index) { |
| 695 | switch (index) { | 721 | switch (index) { |
diff --git a/src/yuzu/applets/qt_controller.cpp b/src/yuzu/applets/qt_controller.cpp index c30b54499..d22db9f6b 100644 --- a/src/yuzu/applets/qt_controller.cpp +++ b/src/yuzu/applets/qt_controller.cpp | |||
| @@ -542,19 +542,14 @@ void QtControllerSelectorDialog::UpdateControllerState(std::size_t player_index) | |||
| 542 | const auto player_connected = player_groupboxes[player_index]->isChecked() && | 542 | const auto player_connected = player_groupboxes[player_index]->isChecked() && |
| 543 | controller_type != Core::HID::NpadStyleIndex::Handheld; | 543 | controller_type != Core::HID::NpadStyleIndex::Handheld; |
| 544 | 544 | ||
| 545 | if (controller->GetNpadStyleIndex(true) == controller_type && | ||
| 546 | controller->IsConnected(true) == player_connected) { | ||
| 547 | return; | ||
| 548 | } | ||
| 549 | |||
| 550 | // Disconnect the controller first. | 545 | // Disconnect the controller first. |
| 551 | UpdateController(controller, controller_type, false); | 546 | UpdateController(controller, controller_type, false); |
| 552 | 547 | ||
| 553 | // Handheld | 548 | // Handheld |
| 554 | if (player_index == 0) { | 549 | if (player_index == 0) { |
| 550 | auto* handheld = system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld); | ||
| 551 | UpdateController(handheld, controller_type, false); | ||
| 555 | if (controller_type == Core::HID::NpadStyleIndex::Handheld) { | 552 | if (controller_type == Core::HID::NpadStyleIndex::Handheld) { |
| 556 | auto* handheld = | ||
| 557 | system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld); | ||
| 558 | UpdateController(handheld, Core::HID::NpadStyleIndex::Handheld, | 553 | UpdateController(handheld, Core::HID::NpadStyleIndex::Handheld, |
| 559 | player_groupboxes[player_index]->isChecked()); | 554 | player_groupboxes[player_index]->isChecked()); |
| 560 | } | 555 | } |
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index bfed2d038..f8fae7416 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp | |||
| @@ -212,16 +212,11 @@ void Config::ReadPlayerValue(std::size_t player_index) { | |||
| 212 | } | 212 | } |
| 213 | 213 | ||
| 214 | if (player_prefix.isEmpty() && Settings::IsConfiguringGlobal()) { | 214 | if (player_prefix.isEmpty() && Settings::IsConfiguringGlobal()) { |
| 215 | const auto controller = static_cast<Settings::ControllerType>( | 215 | player.controller_type = static_cast<Settings::ControllerType>( |
| 216 | qt_config | 216 | qt_config |
| 217 | ->value(QStringLiteral("%1type").arg(player_prefix), | 217 | ->value(QStringLiteral("%1type").arg(player_prefix), |
| 218 | static_cast<u8>(Settings::ControllerType::ProController)) | 218 | static_cast<u8>(Settings::ControllerType::ProController)) |
| 219 | .toUInt()); | 219 | .toUInt()); |
| 220 | |||
| 221 | if (controller == Settings::ControllerType::LeftJoycon || | ||
| 222 | controller == Settings::ControllerType::RightJoycon) { | ||
| 223 | player.controller_type = controller; | ||
| 224 | } | ||
| 225 | } else { | 220 | } else { |
| 226 | player.connected = | 221 | player.connected = |
| 227 | ReadSetting(QStringLiteral("%1connected").arg(player_prefix), player_index == 0) | 222 | ReadSetting(QStringLiteral("%1connected").arg(player_prefix), player_index == 0) |
diff --git a/src/yuzu/configuration/configure_input_per_game.cpp b/src/yuzu/configuration/configure_input_per_game.cpp index 78e65d468..4e77fe00b 100644 --- a/src/yuzu/configuration/configure_input_per_game.cpp +++ b/src/yuzu/configuration/configure_input_per_game.cpp | |||
| @@ -57,7 +57,7 @@ void ConfigureInputPerGame::ApplyConfiguration() { | |||
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | void ConfigureInputPerGame::LoadConfiguration() { | 59 | void ConfigureInputPerGame::LoadConfiguration() { |
| 60 | static constexpr size_t HANDHELD_INDEX = 8; | 60 | static constexpr size_t HANDHELD_INDEX = 0; |
| 61 | 61 | ||
| 62 | auto& hid_core = system.HIDCore(); | 62 | auto& hid_core = system.HIDCore(); |
| 63 | for (size_t player_index = 0; player_index < profile_comboboxes.size(); ++player_index) { | 63 | for (size_t player_index = 0; player_index < profile_comboboxes.size(); ++player_index) { |
| @@ -69,9 +69,6 @@ void ConfigureInputPerGame::LoadConfiguration() { | |||
| 69 | const auto selection_index = player_combobox->currentIndex(); | 69 | const auto selection_index = player_combobox->currentIndex(); |
| 70 | if (selection_index == 0) { | 70 | if (selection_index == 0) { |
| 71 | Settings::values.players.GetValue()[player_index].profile_name = ""; | 71 | Settings::values.players.GetValue()[player_index].profile_name = ""; |
| 72 | if (player_index == 0) { | ||
| 73 | Settings::values.players.GetValue()[HANDHELD_INDEX] = {}; | ||
| 74 | } | ||
| 75 | Settings::values.players.SetGlobal(true); | 72 | Settings::values.players.SetGlobal(true); |
| 76 | emulated_controller->ReloadFromSettings(); | 73 | emulated_controller->ReloadFromSettings(); |
| 77 | continue; | 74 | continue; |
diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 50b62293e..93eb10ceb 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp | |||
| @@ -1589,7 +1589,6 @@ void ConfigureInputPlayer::LoadProfile() { | |||
| 1589 | } | 1589 | } |
| 1590 | 1590 | ||
| 1591 | void ConfigureInputPlayer::SaveProfile() { | 1591 | void ConfigureInputPlayer::SaveProfile() { |
| 1592 | static constexpr size_t HANDHELD_INDEX = 8; | ||
| 1593 | const QString profile_name = ui->comboProfiles->itemText(ui->comboProfiles->currentIndex()); | 1592 | const QString profile_name = ui->comboProfiles->itemText(ui->comboProfiles->currentIndex()); |
| 1594 | 1593 | ||
| 1595 | if (profile_name.isEmpty()) { | 1594 | if (profile_name.isEmpty()) { |
| @@ -1598,12 +1597,7 @@ void ConfigureInputPlayer::SaveProfile() { | |||
| 1598 | 1597 | ||
| 1599 | ApplyConfiguration(); | 1598 | ApplyConfiguration(); |
| 1600 | 1599 | ||
| 1601 | // When we're in handheld mode, only the handheld emulated controller bindings are updated | 1600 | if (!profiles->SaveProfile(profile_name.toStdString(), player_index)) { |
| 1602 | const bool is_handheld = player_index == 0 && emulated_controller->GetNpadIdType() == | ||
| 1603 | Core::HID::NpadIdType::Handheld; | ||
| 1604 | const auto profile_player_index = is_handheld ? HANDHELD_INDEX : player_index; | ||
| 1605 | |||
| 1606 | if (!profiles->SaveProfile(profile_name.toStdString(), profile_player_index)) { | ||
| 1607 | QMessageBox::critical(this, tr("Save Input Profile"), | 1601 | QMessageBox::critical(this, tr("Save Input Profile"), |
| 1608 | tr("Failed to save the input profile \"%1\"").arg(profile_name)); | 1602 | tr("Failed to save the input profile \"%1\"").arg(profile_name)); |
| 1609 | UpdateInputProfiles(); | 1603 | UpdateInputProfiles(); |