diff options
author | t895 <[email protected]> | 2024-02-21 08:21:43 -0500 |
---|---|---|
committer | t895 <[email protected]> | 2024-02-21 08:37:55 -0500 |
commit | de5422b1fde51a64d7ab887f2bf36465ee5e66ac (patch) | |
tree | dee0a890dd82899651411d23f5307d087cca278a /src | |
parent | 45f450fca5c7fabbb30e0d193d1f4a1be6bd287b (diff) | |
download | yuzu-android-de5422b1fde51a64d7ab887f2bf36465ee5e66ac.tar.gz yuzu-android-de5422b1fde51a64d7ab887f2bf36465ee5e66ac.zip |
android: Connect controllers with supported styles
If you tried to connect a controller that was previously configured with an unsupported style for your game, when you try to connect that controller, it will immediately disconnect. This ensures that the controller that is being connected will be changed to the first supported style index before being connected.
Diffstat (limited to 'src')
-rw-r--r-- | src/android/app/src/main/jni/native_input.cpp | 76 |
1 files changed, 46 insertions, 30 deletions
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; } |