summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/yuzu/applets/controller.cpp62
-rw-r--r--src/yuzu/configuration/configure_input_player.cpp61
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
20namespace { 20namespace {
21 21
22constexpr std::size_t HANDHELD_INDEX = 8;
23
22constexpr std::array<std::array<bool, 4>, 8> led_patterns{{ 24constexpr 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
262void QtControllerSelectorDialog::ApplyConfiguration() { 264void 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
276void QtControllerSelectorDialog::LoadConfiguration() { 273void 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)
468void QtControllerSelectorDialog::UpdateControllerState(std::size_t player_index) { 466void 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
499void QtControllerSelectorDialog::UpdateLEDPattern(std::size_t player_index) { 511void 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
29constexpr std::size_t HANDHELD_INDEX = 8;
30
31const std::array<std::string, ConfigureInputPlayer::ANALOG_SUB_BUTTONS_NUM> 29const 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
39namespace { 37namespace {
40 38
39constexpr std::size_t HANDHELD_INDEX = 8;
40
41void UpdateController(Settings::ControllerType controller_type, std::size_t npad_index, 41void 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
597void ConfigureInputPlayer::showEvent(QShowEvent* event) { 608void ConfigureInputPlayer::showEvent(QShowEvent* event) {