diff options
Diffstat (limited to '')
| -rw-r--r-- | src/yuzu/applets/controller.cpp | 62 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player.cpp | 61 |
2 files changed, 73 insertions, 50 deletions
diff --git a/src/yuzu/applets/controller.cpp b/src/yuzu/applets/controller.cpp index cdcd3d28d..552cb7204 100644 --- a/src/yuzu/applets/controller.cpp +++ b/src/yuzu/applets/controller.cpp | |||
| @@ -19,6 +19,8 @@ | |||
| 19 | 19 | ||
| 20 | namespace { | 20 | namespace { |
| 21 | 21 | ||
| 22 | constexpr std::size_t HANDHELD_INDEX = 8; | ||
| 23 | |||
| 22 | constexpr std::array<std::array<bool, 4>, 8> led_patterns{{ | 24 | constexpr std::array<std::array<bool, 4>, 8> led_patterns{{ |
| 23 | {true, false, false, false}, | 25 | {true, false, false, false}, |
| 24 | {true, true, false, false}, | 26 | {true, true, false, false}, |
| @@ -260,11 +262,6 @@ int QtControllerSelectorDialog::exec() { | |||
| 260 | } | 262 | } |
| 261 | 263 | ||
| 262 | void QtControllerSelectorDialog::ApplyConfiguration() { | 264 | void QtControllerSelectorDialog::ApplyConfiguration() { |
| 263 | // Update the controller state once more, just to be sure they are properly applied. | ||
| 264 | for (std::size_t index = 0; index < NUM_PLAYERS; ++index) { | ||
| 265 | UpdateControllerState(index); | ||
| 266 | } | ||
| 267 | |||
| 268 | const bool pre_docked_mode = Settings::values.use_docked_mode.GetValue(); | 265 | const bool pre_docked_mode = Settings::values.use_docked_mode.GetValue(); |
| 269 | Settings::values.use_docked_mode.SetValue(ui->radioDocked->isChecked()); | 266 | Settings::values.use_docked_mode.SetValue(ui->radioDocked->isChecked()); |
| 270 | OnDockedModeChanged(pre_docked_mode, Settings::values.use_docked_mode.GetValue()); | 267 | OnDockedModeChanged(pre_docked_mode, Settings::values.use_docked_mode.GetValue()); |
| @@ -275,15 +272,16 @@ void QtControllerSelectorDialog::ApplyConfiguration() { | |||
| 275 | 272 | ||
| 276 | void QtControllerSelectorDialog::LoadConfiguration() { | 273 | void QtControllerSelectorDialog::LoadConfiguration() { |
| 277 | for (std::size_t index = 0; index < NUM_PLAYERS; ++index) { | 274 | for (std::size_t index = 0; index < NUM_PLAYERS; ++index) { |
| 278 | const auto connected = Settings::values.players.GetValue()[index].connected || | 275 | const auto connected = |
| 279 | (index == 0 && Settings::values.players.GetValue()[8].connected); | 276 | Settings::values.players.GetValue()[index].connected || |
| 277 | (index == 0 && Settings::values.players.GetValue()[HANDHELD_INDEX].connected); | ||
| 280 | player_groupboxes[index]->setChecked(connected); | 278 | player_groupboxes[index]->setChecked(connected); |
| 281 | connected_controller_checkboxes[index]->setChecked(connected); | 279 | connected_controller_checkboxes[index]->setChecked(connected); |
| 282 | emulated_controllers[index]->setCurrentIndex( | 280 | emulated_controllers[index]->setCurrentIndex( |
| 283 | GetIndexFromControllerType(Settings::values.players.GetValue()[index].controller_type)); | 281 | GetIndexFromControllerType(Settings::values.players.GetValue()[index].controller_type)); |
| 284 | } | 282 | } |
| 285 | 283 | ||
| 286 | UpdateDockedState(Settings::values.players.GetValue()[8].connected); | 284 | UpdateDockedState(Settings::values.players.GetValue()[HANDHELD_INDEX].connected); |
| 287 | 285 | ||
| 288 | ui->vibrationGroup->setChecked(Settings::values.vibration_enabled.GetValue()); | 286 | ui->vibrationGroup->setChecked(Settings::values.vibration_enabled.GetValue()); |
| 289 | ui->motionGroup->setChecked(Settings::values.motion_enabled.GetValue()); | 287 | ui->motionGroup->setChecked(Settings::values.motion_enabled.GetValue()); |
| @@ -468,32 +466,46 @@ void QtControllerSelectorDialog::UpdateControllerIcon(std::size_t player_index) | |||
| 468 | void QtControllerSelectorDialog::UpdateControllerState(std::size_t player_index) { | 466 | void QtControllerSelectorDialog::UpdateControllerState(std::size_t player_index) { |
| 469 | auto& player = Settings::values.players.GetValue()[player_index]; | 467 | auto& player = Settings::values.players.GetValue()[player_index]; |
| 470 | 468 | ||
| 471 | player.controller_type = | 469 | const auto controller_type = |
| 472 | GetControllerTypeFromIndex(emulated_controllers[player_index]->currentIndex()); | 470 | GetControllerTypeFromIndex(emulated_controllers[player_index]->currentIndex()); |
| 473 | player.connected = player_groupboxes[player_index]->isChecked(); | 471 | const auto player_connected = player_groupboxes[player_index]->isChecked() && |
| 472 | controller_type != Settings::ControllerType::Handheld; | ||
| 474 | 473 | ||
| 475 | // Player 2-8 | 474 | if (player.controller_type == controller_type && player.connected == player_connected) { |
| 476 | if (player_index != 0) { | 475 | // Set vibration devices in the event that the input device has changed. |
| 477 | UpdateController(player.controller_type, player_index, player.connected); | 476 | ConfigureVibration::SetVibrationDevices(player_index); |
| 478 | return; | 477 | return; |
| 479 | } | 478 | } |
| 480 | 479 | ||
| 480 | // Disconnect the controller first. | ||
| 481 | UpdateController(controller_type, player_index, false); | ||
| 482 | |||
| 483 | player.controller_type = controller_type; | ||
| 484 | player.connected = player_connected; | ||
| 485 | |||
| 481 | ConfigureVibration::SetVibrationDevices(player_index); | 486 | ConfigureVibration::SetVibrationDevices(player_index); |
| 482 | 487 | ||
| 483 | // Player 1 and Handheld | 488 | // Handheld |
| 484 | auto& handheld = Settings::values.players.GetValue()[8]; | 489 | if (player_index == 0) { |
| 485 | // If Handheld is selected, copy all the settings from Player 1 to Handheld. | 490 | auto& handheld = Settings::values.players.GetValue()[HANDHELD_INDEX]; |
| 486 | if (player.controller_type == Settings::ControllerType::Handheld) { | 491 | if (controller_type == Settings::ControllerType::Handheld) { |
| 487 | handheld = player; | 492 | handheld = player; |
| 488 | handheld.connected = player_groupboxes[player_index]->isChecked(); | 493 | } |
| 489 | player.connected = false; // Disconnect Player 1 | 494 | handheld.connected = player_groupboxes[player_index]->isChecked() && |
| 490 | } else { | 495 | controller_type == Settings::ControllerType::Handheld; |
| 491 | player.connected = player_groupboxes[player_index]->isChecked(); | 496 | UpdateController(Settings::ControllerType::Handheld, 8, handheld.connected); |
| 492 | handheld.connected = false; // Disconnect Handheld | 497 | } |
| 498 | |||
| 499 | if (!player.connected) { | ||
| 500 | return; | ||
| 493 | } | 501 | } |
| 494 | 502 | ||
| 495 | UpdateController(player.controller_type, player_index, player.connected); | 503 | // This emulates a delay between disconnecting and reconnecting controllers as some games |
| 496 | UpdateController(Settings::ControllerType::Handheld, 8, handheld.connected); | 504 | // do not respond to a change in controller type if it was instantaneous. |
| 505 | using namespace std::chrono_literals; | ||
| 506 | std::this_thread::sleep_for(20ms); | ||
| 507 | |||
| 508 | UpdateController(controller_type, player_index, player_connected); | ||
| 497 | } | 509 | } |
| 498 | 510 | ||
| 499 | void QtControllerSelectorDialog::UpdateLEDPattern(std::size_t player_index) { | 511 | void QtControllerSelectorDialog::UpdateLEDPattern(std::size_t player_index) { |
diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 3e785c224..1ee4725ef 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp | |||
| @@ -26,8 +26,6 @@ | |||
| 26 | #include "yuzu/configuration/input_profiles.h" | 26 | #include "yuzu/configuration/input_profiles.h" |
| 27 | #include "yuzu/util/limitable_input_dialog.h" | 27 | #include "yuzu/util/limitable_input_dialog.h" |
| 28 | 28 | ||
| 29 | constexpr std::size_t HANDHELD_INDEX = 8; | ||
| 30 | |||
| 31 | const std::array<std::string, ConfigureInputPlayer::ANALOG_SUB_BUTTONS_NUM> | 29 | const std::array<std::string, ConfigureInputPlayer::ANALOG_SUB_BUTTONS_NUM> |
| 32 | ConfigureInputPlayer::analog_sub_buttons{{ | 30 | ConfigureInputPlayer::analog_sub_buttons{{ |
| 33 | "up", | 31 | "up", |
| @@ -38,12 +36,10 @@ const std::array<std::string, ConfigureInputPlayer::ANALOG_SUB_BUTTONS_NUM> | |||
| 38 | 36 | ||
| 39 | namespace { | 37 | namespace { |
| 40 | 38 | ||
| 39 | constexpr std::size_t HANDHELD_INDEX = 8; | ||
| 40 | |||
| 41 | void UpdateController(Settings::ControllerType controller_type, std::size_t npad_index, | 41 | void UpdateController(Settings::ControllerType controller_type, std::size_t npad_index, |
| 42 | bool connected) { | 42 | bool connected) { |
| 43 | auto& player = Settings::values.players.GetValue()[npad_index]; | ||
| 44 | player.controller_type = controller_type; | ||
| 45 | player.connected = connected; | ||
| 46 | |||
| 47 | Core::System& system{Core::System::GetInstance()}; | 43 | Core::System& system{Core::System::GetInstance()}; |
| 48 | if (!system.IsPoweredOn()) { | 44 | if (!system.IsPoweredOn()) { |
| 49 | return; | 45 | return; |
| @@ -563,35 +559,50 @@ void ConfigureInputPlayer::ApplyConfiguration() { | |||
| 563 | } | 559 | } |
| 564 | 560 | ||
| 565 | auto& motions = player.motions; | 561 | auto& motions = player.motions; |
| 562 | |||
| 566 | std::transform(motions_param.begin(), motions_param.end(), motions.begin(), | 563 | std::transform(motions_param.begin(), motions_param.end(), motions.begin(), |
| 567 | [](const Common::ParamPackage& param) { return param.Serialize(); }); | 564 | [](const Common::ParamPackage& param) { return param.Serialize(); }); |
| 568 | 565 | ||
| 569 | player.controller_type = | 566 | const auto controller_type = |
| 570 | static_cast<Settings::ControllerType>(ui->comboControllerType->currentIndex()); | 567 | GetControllerTypeFromIndex(ui->comboControllerType->currentIndex()); |
| 571 | player.connected = ui->groupConnectedController->isChecked(); | 568 | const auto player_connected = ui->groupConnectedController->isChecked() && |
| 569 | controller_type != Settings::ControllerType::Handheld; | ||
| 570 | |||
| 571 | if (player.controller_type == controller_type && player.connected == player_connected) { | ||
| 572 | // Set vibration devices in the event that the input device has changed. | ||
| 573 | ConfigureVibration::SetVibrationDevices(player_index); | ||
| 574 | return; | ||
| 575 | } | ||
| 576 | |||
| 577 | // Disconnect the controller first. | ||
| 578 | UpdateController(controller_type, player_index, false); | ||
| 579 | |||
| 580 | player.controller_type = controller_type; | ||
| 581 | player.connected = player_connected; | ||
| 572 | 582 | ||
| 573 | ConfigureVibration::SetVibrationDevices(player_index); | 583 | ConfigureVibration::SetVibrationDevices(player_index); |
| 574 | 584 | ||
| 575 | // Player 2-8 | 585 | // Handheld |
| 576 | if (player_index != 0) { | 586 | if (player_index == 0) { |
| 577 | UpdateController(player.controller_type, player_index, player.connected); | 587 | auto& handheld = Settings::values.players.GetValue()[HANDHELD_INDEX]; |
| 578 | return; | 588 | if (controller_type == Settings::ControllerType::Handheld) { |
| 589 | handheld = player; | ||
| 590 | } | ||
| 591 | handheld.connected = ui->groupConnectedController->isChecked() && | ||
| 592 | controller_type == Settings::ControllerType::Handheld; | ||
| 593 | UpdateController(Settings::ControllerType::Handheld, HANDHELD_INDEX, handheld.connected); | ||
| 579 | } | 594 | } |
| 580 | 595 | ||
| 581 | // Player 1 and Handheld | 596 | if (!player.connected) { |
| 582 | auto& handheld = Settings::values.players.GetValue()[HANDHELD_INDEX]; | 597 | return; |
| 583 | // If Handheld is selected, copy all the settings from Player 1 to Handheld. | ||
| 584 | if (player.controller_type == Settings::ControllerType::Handheld) { | ||
| 585 | handheld = player; | ||
| 586 | handheld.connected = ui->groupConnectedController->isChecked(); | ||
| 587 | player.connected = false; // Disconnect Player 1 | ||
| 588 | } else { | ||
| 589 | player.connected = ui->groupConnectedController->isChecked(); | ||
| 590 | handheld.connected = false; // Disconnect Handheld | ||
| 591 | } | 598 | } |
| 592 | 599 | ||
| 593 | UpdateController(player.controller_type, player_index, player.connected); | 600 | // This emulates a delay between disconnecting and reconnecting controllers as some games |
| 594 | UpdateController(Settings::ControllerType::Handheld, HANDHELD_INDEX, handheld.connected); | 601 | // do not respond to a change in controller type if it was instantaneous. |
| 602 | using namespace std::chrono_literals; | ||
| 603 | std::this_thread::sleep_for(20ms); | ||
| 604 | |||
| 605 | UpdateController(controller_type, player_index, player_connected); | ||
| 595 | } | 606 | } |
| 596 | 607 | ||
| 597 | void ConfigureInputPlayer::showEvent(QShowEvent* event) { | 608 | void ConfigureInputPlayer::showEvent(QShowEvent* event) { |