diff options
| author | liamwhite <liamwhite@users.noreply.github.com> | 2024-02-21 10:43:46 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-21 10:43:46 -0500 | 
| commit | 8bbc209950178ca7258bfc22a08101cb30c29a58 (patch) | |
| tree | 642d3775fa0136b84bbfcff7363441bd8f4145df | |
| parent | 9e1a67b950bf21ab01765c0026707571901088b6 (diff) | |
| parent | de5422b1fde51a64d7ab887f2bf36465ee5e66ac (diff) | |
Merge pull request #13105 from t895/connection-fix
android: Misc controller fixes
3 files changed, 52 insertions, 33 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/PlayerInput.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/PlayerInput.kt index d35de80c4..a84ac77a2 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/PlayerInput.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/PlayerInput.kt @@ -64,17 +64,17 @@ data class PlayerInput(      fun hasMapping(): Boolean {          var hasMapping = false          buttons.forEach { -            if (it != "[empty]") { +            if (it != "[empty]" && it.isNotEmpty()) {                  hasMapping = true              }          }          analogs.forEach { -            if (it != "[empty]") { +            if (it != "[empty]" && it.isNotEmpty()) {                  hasMapping = true              }          }          motions.forEach { -            if (it != "[empty]") { +            if (it != "[empty]" && it.isNotEmpty()) {                  hasMapping = true              }          } diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 4ea82e217..1226219ad 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -292,6 +292,9 @@ void EmulationSession::ShutdownEmulation() {      // Unload user input.      m_system.HIDCore().UnloadInputDevices(); +    // Enable all controllers +    m_system.HIDCore().SetSupportedStyleTag({Core::HID::NpadStyleSet::All}); +      // Shutdown the main emulated process      if (m_load_result == Core::SystemResultStatus::Success) {          m_system.DetachDebugger(); diff --git a/src/android/app/src/main/jni/native_input.cpp b/src/android/app/src/main/jni/native_input.cpp index 37a65f2b8..4935a4607 100644 --- a/src/android/app/src/main/jni/native_input.cpp +++ b/src/android/app/src/main/jni/native_input.cpp @@ -102,8 +102,50 @@ void ApplyControllerConfig(size_t player_index,      }  } +std::vector<s32> GetSupportedStyles(int player_index) { +    auto& hid_core = EmulationSession::GetInstance().System().HIDCore(); +    const auto npad_style_set = hid_core.GetSupportedStyleTag(); +    std::vector<s32> supported_indexes; +    if (npad_style_set.fullkey == 1) { +        supported_indexes.push_back(static_cast<s32>(Core::HID::NpadStyleIndex::Fullkey)); +    } + +    if (npad_style_set.joycon_dual == 1) { +        supported_indexes.push_back(static_cast<s32>(Core::HID::NpadStyleIndex::JoyconDual)); +    } + +    if (npad_style_set.joycon_left == 1) { +        supported_indexes.push_back(static_cast<s32>(Core::HID::NpadStyleIndex::JoyconLeft)); +    } + +    if (npad_style_set.joycon_right == 1) { +        supported_indexes.push_back(static_cast<s32>(Core::HID::NpadStyleIndex::JoyconRight)); +    } + +    if (player_index == 0 && npad_style_set.handheld == 1) { +        supported_indexes.push_back(static_cast<s32>(Core::HID::NpadStyleIndex::Handheld)); +    } + +    if (npad_style_set.gamecube == 1) { +        supported_indexes.push_back(static_cast<s32>(Core::HID::NpadStyleIndex::GameCube)); +    } + +    return supported_indexes; +} +  void ConnectController(size_t player_index, bool connected) {      auto& hid_core = EmulationSession::GetInstance().System().HIDCore(); +    ApplyControllerConfig(player_index, [&](Core::HID::EmulatedController* controller) { +        auto supported_styles = GetSupportedStyles(player_index); +        auto controller_style = controller->GetNpadStyleIndex(true); +        auto style = std::find(supported_styles.begin(), supported_styles.end(), +                               static_cast<int>(controller_style)); +        if (style == supported_styles.end() && !supported_styles.empty()) { +            controller->SetNpadStyleIndex( +                static_cast<Core::HID::NpadStyleIndex>(supported_styles[0])); +        } +    }); +      if (player_index == 0) {          auto* handheld = hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld);          auto* player_one = hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1); @@ -522,36 +564,10 @@ jint Java_org_yuzu_yuzu_1emu_features_input_NativeInput_getButtonNameImpl(JNIEnv  jintArray Java_org_yuzu_yuzu_1emu_features_input_NativeInput_getSupportedStyleTagsImpl(      JNIEnv* env, jobject j_obj, jint j_player_index) { -    auto& hid_core = EmulationSession::GetInstance().System().HIDCore(); -    const auto npad_style_set = hid_core.GetSupportedStyleTag(); -    std::vector<s32> supported_indexes; -    if (npad_style_set.fullkey == 1) { -        supported_indexes.push_back(static_cast<u32>(Core::HID::NpadStyleIndex::Fullkey)); -    } - -    if (npad_style_set.joycon_dual == 1) { -        supported_indexes.push_back(static_cast<u32>(Core::HID::NpadStyleIndex::JoyconDual)); -    } - -    if (npad_style_set.joycon_left == 1) { -        supported_indexes.push_back(static_cast<u32>(Core::HID::NpadStyleIndex::JoyconLeft)); -    } - -    if (npad_style_set.joycon_right == 1) { -        supported_indexes.push_back(static_cast<u32>(Core::HID::NpadStyleIndex::JoyconRight)); -    } - -    if (j_player_index == 0 && npad_style_set.handheld == 1) { -        supported_indexes.push_back(static_cast<u32>(Core::HID::NpadStyleIndex::Handheld)); -    } - -    if (npad_style_set.gamecube == 1) { -        supported_indexes.push_back(static_cast<u32>(Core::HID::NpadStyleIndex::GameCube)); -    } - -    jintArray j_supported_indexes = env->NewIntArray(supported_indexes.size()); -    env->SetIntArrayRegion(j_supported_indexes, 0, supported_indexes.size(), -                           supported_indexes.data()); +    auto supported_styles = GetSupportedStyles(j_player_index); +    jintArray j_supported_indexes = env->NewIntArray(supported_styles.size()); +    env->SetIntArrayRegion(j_supported_indexes, 0, supported_styles.size(), +                           supported_styles.data());      return j_supported_indexes;  }  | 
