diff options
| author | JosJuice <josjuice@gmail.com> | 2023-03-11 12:37:44 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-11 12:37:44 +0100 |
| commit | 62ff2f1030ae95ac0e5bf9ae02e9cc78664ab83e (patch) | |
| tree | 14c8c2abdaa0eb4c4dd55b4b8171bd354356b82e /Source/Android/jni/Input/EmulatedController.cpp | |
| parent | 7b5c989f2d55796e5d925144d1a2f30bac4521b1 (diff) | |
| parent | 75fb1a7edfb12f490b08ab0b76a8e2f1536d2d9b (diff) | |
Merge pull request #11385 from JosJuice/android-input-overhaul
Android input overhaul
Diffstat (limited to 'Source/Android/jni/Input/EmulatedController.cpp')
| -rw-r--r-- | Source/Android/jni/Input/EmulatedController.cpp | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/Source/Android/jni/Input/EmulatedController.cpp b/Source/Android/jni/Input/EmulatedController.cpp new file mode 100644 index 0000000000..6c8d64e22f --- /dev/null +++ b/Source/Android/jni/Input/EmulatedController.cpp @@ -0,0 +1,174 @@ +// Copyright 2022 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include <jni.h> + +#include "Common/FileUtil.h" +#include "Common/IniFile.h" +#include "Core/HW/GCPad.h" +#include "Core/HW/Wiimote.h" +#include "Core/HW/WiimoteEmu/WiimoteEmu.h" +#include "InputCommon/ControllerEmu/ControlGroup/Attachments.h" +#include "InputCommon/ControllerEmu/ControllerEmu.h" +#include "InputCommon/ControllerInterface/ControllerInterface.h" +#include "InputCommon/InputConfig.h" +#include "jni/AndroidCommon/AndroidCommon.h" +#include "jni/AndroidCommon/IDCache.h" +#include "jni/Input/Control.h" +#include "jni/Input/ControlGroup.h" +#include "jni/Input/ControlReference.h" +#include "jni/Input/NumericSetting.h" + +ControllerEmu::EmulatedController* EmulatedControllerFromJava(JNIEnv* env, jobject obj) +{ + return reinterpret_cast<ControllerEmu::EmulatedController*>( + env->GetLongField(obj, IDCache::GetEmulatedControllerPointer())); +} + +static jobject EmulatedControllerToJava(JNIEnv* env, ControllerEmu::EmulatedController* controller) +{ + if (!controller) + return nullptr; + + return env->NewObject(IDCache::GetEmulatedControllerClass(), + IDCache::GetEmulatedControllerConstructor(), + reinterpret_cast<jlong>(controller)); +} + +extern "C" { + +JNIEXPORT jstring JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getDefaultDevice( + JNIEnv* env, jobject obj) +{ + return ToJString(env, EmulatedControllerFromJava(env, obj)->GetDefaultDevice().ToString()); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_setDefaultDevice( + JNIEnv* env, jobject obj, jstring j_device) +{ + return EmulatedControllerFromJava(env, obj)->SetDefaultDevice(GetJString(env, j_device)); +} + +JNIEXPORT jint JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getGroupCount( + JNIEnv* env, jobject obj) +{ + return static_cast<jint>(EmulatedControllerFromJava(env, obj)->groups.size()); +} + +JNIEXPORT jobject JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getGroup( + JNIEnv* env, jobject obj, jint controller_index) +{ + return ControlGroupToJava(env, + EmulatedControllerFromJava(env, obj)->groups[controller_index].get()); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_updateSingleControlReference( + JNIEnv* env, jobject obj, jobject control_reference) +{ + return EmulatedControllerFromJava(env, obj)->UpdateSingleControlReference( + g_controller_interface, ControlReferenceFromJava(env, control_reference)); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_loadDefaultSettings( + JNIEnv* env, jobject obj) +{ + ControllerEmu::EmulatedController* controller = EmulatedControllerFromJava(env, obj); + + controller->LoadDefaults(g_controller_interface); + controller->UpdateReferences(g_controller_interface); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_clearSettings( + JNIEnv* env, jobject obj) +{ + ControllerEmu::EmulatedController* controller = EmulatedControllerFromJava(env, obj); + + // Loading an empty IniFile section clears everything. + IniFile::Section section; + + controller->LoadConfig(§ion); + controller->UpdateReferences(g_controller_interface); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_loadProfile( + JNIEnv* env, jobject obj, jstring j_path) +{ + ControllerEmu::EmulatedController* controller = EmulatedControllerFromJava(env, obj); + + IniFile ini; + ini.Load(GetJString(env, j_path)); + + controller->LoadConfig(ini.GetOrCreateSection("Profile")); + controller->UpdateReferences(g_controller_interface); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_saveProfile( + JNIEnv* env, jobject obj, jstring j_path) +{ + const std::string path = GetJString(env, j_path); + + File::CreateFullPath(path); + + IniFile ini; + + EmulatedControllerFromJava(env, obj)->SaveConfig(ini.GetOrCreateSection("Profile")); + ini.Save(path); +} + +JNIEXPORT jobject JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getGcPad( + JNIEnv* env, jclass, jint controller_index) +{ + return EmulatedControllerToJava(env, Pad::GetConfig()->GetController(controller_index)); +} + +JNIEXPORT jobject JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getWiimote( + JNIEnv* env, jclass, jint controller_index) +{ + return EmulatedControllerToJava(env, Wiimote::GetConfig()->GetController(controller_index)); +} + +JNIEXPORT jobject JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getWiimoteAttachment( + JNIEnv* env, jclass, jint controller_index, jint attachment_index) +{ + auto* attachments = static_cast<ControllerEmu::Attachments*>( + Wiimote::GetWiimoteGroup(controller_index, WiimoteEmu::WiimoteGroup::Attachments)); + return EmulatedControllerToJava(env, attachments->GetAttachmentList()[attachment_index].get()); +} + +JNIEXPORT jint JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getSelectedWiimoteAttachment( + JNIEnv* env, jclass, jint controller_index) +{ + auto* attachments = static_cast<ControllerEmu::Attachments*>( + Wiimote::GetWiimoteGroup(controller_index, WiimoteEmu::WiimoteGroup::Attachments)); + return static_cast<jint>(attachments->GetSelectedAttachment()); +} + +JNIEXPORT jobject JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getSidewaysWiimoteSetting( + JNIEnv* env, jclass, jint controller_index) +{ + ControllerEmu::ControlGroup* options = + Wiimote::GetWiimoteGroup(controller_index, WiimoteEmu::WiimoteGroup::Options); + + for (auto& setting : options->numeric_settings) + { + if (setting->GetININame() == WiimoteEmu::Wiimote::SIDEWAYS_OPTION) + return NumericSettingToJava(env, setting.get()); + } + + return nullptr; +} +} |
