diff options
Diffstat (limited to 'src/yuzu/configuration')
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 61 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player.cpp | 7 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_vibration.cpp | 80 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_vibration.h | 3 | 
4 files changed, 129 insertions, 22 deletions
| diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 7f66f29aa..6fa842cd5 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -344,21 +344,6 @@ void Config::ReadPlayerValue(std::size_t player_index) {          }      } -    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 = qt_config -                             ->value(QStringLiteral("%1").arg(player_prefix) + -                                         QString::fromUtf8(Settings::NativeMotion::mapping[i]), -                                     QString::fromStdString(default_param)) -                             .toString() -                             .toStdString(); -        if (player_motions.empty()) { -            player_motions = default_param; -        } -    } -      for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {          const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(              default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], @@ -375,6 +360,33 @@ void Config::ReadPlayerValue(std::size_t player_index) {              player_analogs = default_param;          }      } + +    for (int i = 0; i < Settings::NativeVibration::NumVibrations; ++i) { +        auto& player_vibrations = player.vibrations[i]; + +        player_vibrations = +            qt_config +                ->value(QStringLiteral("%1").arg(player_prefix) + +                            QString::fromUtf8(Settings::NativeVibration::mapping[i]), +                        QString{}) +                .toString() +                .toStdString(); +    } + +    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 = qt_config +                             ->value(QStringLiteral("%1").arg(player_prefix) + +                                         QString::fromUtf8(Settings::NativeMotion::mapping[i]), +                                     QString::fromStdString(default_param)) +                             .toString() +                             .toStdString(); +        if (player_motions.empty()) { +            player_motions = default_param; +        } +    }  }  void Config::ReadDebugValues() { @@ -1014,13 +1026,6 @@ void Config::SavePlayerValue(std::size_t player_index) {                       QString::fromStdString(player.buttons[i]),                       QString::fromStdString(default_param));      } -    for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) { -        const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]); -        WriteSetting(QStringLiteral("%1").arg(player_prefix) + -                         QString::fromStdString(Settings::NativeMotion::mapping[i]), -                     QString::fromStdString(player.motions[i]), -                     QString::fromStdString(default_param)); -    }      for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {          const std::string default_param = InputCommon::GenerateAnalogParamFromKeys(              default_analogs[i][0], default_analogs[i][1], default_analogs[i][2], @@ -1030,6 +1035,18 @@ void Config::SavePlayerValue(std::size_t player_index) {                       QString::fromStdString(player.analogs[i]),                       QString::fromStdString(default_param));      } +    for (int i = 0; i < Settings::NativeVibration::NumVibrations; ++i) { +        WriteSetting(QStringLiteral("%1").arg(player_prefix) + +                         QString::fromStdString(Settings::NativeVibration::mapping[i]), +                     QString::fromStdString(player.vibrations[i]), QString{}); +    } +    for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) { +        const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]); +        WriteSetting(QStringLiteral("%1").arg(player_prefix) + +                         QString::fromStdString(Settings::NativeMotion::mapping[i]), +                     QString::fromStdString(player.motions[i]), +                     QString::fromStdString(default_param)); +    }  }  void Config::SaveDebugValues() { diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 460ff08a4..3e785c224 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -22,6 +22,7 @@  #include "ui_configure_input_player.h"  #include "yuzu/configuration/config.h"  #include "yuzu/configuration/configure_input_player.h" +#include "yuzu/configuration/configure_vibration.h"  #include "yuzu/configuration/input_profiles.h"  #include "yuzu/util/limitable_input_dialog.h" @@ -39,6 +40,10 @@ namespace {  void UpdateController(Settings::ControllerType controller_type, std::size_t npad_index,                        bool connected) { +    auto& player = Settings::values.players.GetValue()[npad_index]; +    player.controller_type = controller_type; +    player.connected = connected; +      Core::System& system{Core::System::GetInstance()};      if (!system.IsPoweredOn()) {          return; @@ -565,6 +570,8 @@ void ConfigureInputPlayer::ApplyConfiguration() {          static_cast<Settings::ControllerType>(ui->comboControllerType->currentIndex());      player.connected = ui->groupConnectedController->isChecked(); +    ConfigureVibration::SetVibrationDevices(player_index); +      // Player 2-8      if (player_index != 0) {          UpdateController(player.controller_type, player_index, player.connected); diff --git a/src/yuzu/configuration/configure_vibration.cpp b/src/yuzu/configuration/configure_vibration.cpp index 1c68f28f3..714db5b80 100644 --- a/src/yuzu/configuration/configure_vibration.cpp +++ b/src/yuzu/configuration/configure_vibration.cpp @@ -2,6 +2,12 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +#include <algorithm> +#include <unordered_map> + +#include <fmt/format.h> + +#include "common/param_package.h"  #include "core/settings.h"  #include "ui_configure_vibration.h"  #include "yuzu/configuration/configure_vibration.h" @@ -53,6 +59,80 @@ void ConfigureVibration::ApplyConfiguration() {          ui->checkBoxAccurateVibration->isChecked());  } +void ConfigureVibration::SetVibrationDevices(std::size_t player_index) { +    using namespace Settings::NativeButton; +    static constexpr std::array<std::array<Settings::NativeButton::Values, 6>, 2> buttons{{ +        {DLeft, DUp, DRight, DDown, L, ZL}, // Left Buttons +        {A, B, X, Y, R, ZR},                // Right Buttons +    }}; + +    auto& player = Settings::values.players.GetValue()[player_index]; + +    for (std::size_t device_idx = 0; device_idx < buttons.size(); ++device_idx) { +        std::unordered_map<std::string, int> params_count; + +        for (const auto button_index : buttons[device_idx]) { +            const auto& player_button = player.buttons[button_index]; + +            if (params_count.find(player_button) != params_count.end()) { +                ++params_count[player_button]; +                continue; +            } + +            params_count.insert_or_assign(player_button, 1); +        } + +        const auto it = std::max_element( +            params_count.begin(), params_count.end(), +            [](const auto& lhs, const auto& rhs) { return lhs.second < rhs.second; }); + +        auto& vibration_param_str = player.vibrations[device_idx]; +        vibration_param_str.clear(); + +        if (it->first.empty()) { +            continue; +        } + +        const auto param = Common::ParamPackage(it->first); + +        const auto engine = param.Get("engine", ""); +        const auto guid = param.Get("guid", ""); +        const auto port = param.Get("port", ""); + +        if (engine.empty() || engine == "keyboard") { +            continue; +        } + +        vibration_param_str += fmt::format("engine:{}", engine); + +        if (!port.empty()) { +            vibration_param_str += fmt::format(",port:{}", port); +        } +        if (!guid.empty()) { +            vibration_param_str += fmt::format(",guid:{}", guid); +        } +    } + +    if (player.vibrations[0] != player.vibrations[1]) { +        return; +    } + +    if (!player.vibrations[0].empty() && +        player.controller_type != Settings::ControllerType::RightJoycon) { +        player.vibrations[1].clear(); +    } else if (!player.vibrations[1].empty() && +               player.controller_type == Settings::ControllerType::RightJoycon) { +        player.vibrations[0].clear(); +    } +} + +void ConfigureVibration::SetAllVibrationDevices() { +    // Set vibration devices for all player indices including handheld +    for (std::size_t player_idx = 0; player_idx < NUM_PLAYERS + 1; ++player_idx) { +        SetVibrationDevices(player_idx); +    } +} +  void ConfigureVibration::changeEvent(QEvent* event) {      if (event->type() == QEvent::LanguageChange) {          RetranslateUI(); diff --git a/src/yuzu/configuration/configure_vibration.h b/src/yuzu/configuration/configure_vibration.h index 37bbc2653..07411a86f 100644 --- a/src/yuzu/configuration/configure_vibration.h +++ b/src/yuzu/configuration/configure_vibration.h @@ -24,6 +24,9 @@ public:      void ApplyConfiguration(); +    static void SetVibrationDevices(std::size_t player_index); +    static void SetAllVibrationDevices(); +  private:      void changeEvent(QEvent* event) override;      void RetranslateUI(); | 
