diff options
| author | JosJuice <josjuice@gmail.com> | 2022-12-27 16:29:01 +0100 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2023-03-07 17:39:30 +0100 |
| commit | c2779aef060137d9062cfd29babb3c43fc5fa2b5 (patch) | |
| tree | 421bbf1ba198ec00b5e7dfe9118da77e079d89c1 /Source/Android/jni/Input/CoreDevice.cpp | |
| parent | 42943672bbbed6c18aa2bc85c41102a0616547f7 (diff) | |
Android: Add the advanced input mapping dialog
It's missing a lot of features from the PC version for now, like
buttons for inserting functions and the ability to see what the
expression evaluates to. I mostly just wanted to get something in
place so you can set up rumble.
Co-authored-by: Charles Lombardo <clombardo169@gmail.com>
Diffstat (limited to 'Source/Android/jni/Input/CoreDevice.cpp')
| -rw-r--r-- | Source/Android/jni/Input/CoreDevice.cpp | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/Source/Android/jni/Input/CoreDevice.cpp b/Source/Android/jni/Input/CoreDevice.cpp new file mode 100644 index 0000000000..4fd4758ebb --- /dev/null +++ b/Source/Android/jni/Input/CoreDevice.cpp @@ -0,0 +1,84 @@ +// Copyright 2022 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "jni/Input/CoreDevice.h" + +#include <memory> +#include <utility> +#include <vector> + +#include <jni.h> + +#include "InputCommon/ControllerInterface/CoreDevice.h" +#include "jni/AndroidCommon/AndroidCommon.h" +#include "jni/AndroidCommon/IDCache.h" + +static ciface::Core::Device::Control* GetControlPointer(JNIEnv* env, jobject obj) +{ + return reinterpret_cast<ciface::Core::Device::Control*>( + env->GetLongField(obj, IDCache::GetCoreDeviceControlPointer())); +} + +static jobject CoreDeviceControlToJava(JNIEnv* env, jobject device, + ciface::Core::Device::Control* control) +{ + if (!control) + return nullptr; + + return env->NewObject(IDCache::GetCoreDeviceControlClass(), + IDCache::GetCoreDeviceControlConstructor(), device, + reinterpret_cast<jlong>(control)); +} + +template <typename T> +static jobjectArray CoreDeviceControlVectorToJava(JNIEnv* env, jobject device, + const std::vector<T*>& controls) +{ + return VectorToJObjectArray( + env, controls, IDCache::GetCoreDeviceControlClass(), + [device](JNIEnv* env, T* control) { return CoreDeviceControlToJava(env, device, control); }); +} + +static std::shared_ptr<ciface::Core::Device>* GetDevicePointer(JNIEnv* env, jobject obj) +{ + return reinterpret_cast<std::shared_ptr<ciface::Core::Device>*>( + env->GetLongField(obj, IDCache::GetCoreDevicePointer())); +} + +jobject CoreDeviceToJava(JNIEnv* env, std::shared_ptr<ciface::Core::Device> device) +{ + if (!device) + return nullptr; + + return env->NewObject( + IDCache::GetCoreDeviceClass(), IDCache::GetCoreDeviceConstructor(), + reinterpret_cast<jlong>(new std::shared_ptr<ciface::Core::Device>(std::move(device)))); +} + +extern "C" { + +JNIEXPORT jstring JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_CoreDevice_00024Control_getName(JNIEnv* env, + jobject obj) +{ + return ToJString(env, GetControlPointer(env, obj)->GetName()); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_CoreDevice_finalize(JNIEnv* env, jobject obj) +{ + delete GetDevicePointer(env, obj); +} + +JNIEXPORT jobjectArray JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_CoreDevice_getInputs(JNIEnv* env, jobject obj) +{ + return CoreDeviceControlVectorToJava(env, obj, (*GetDevicePointer(env, obj))->Inputs()); +} + +JNIEXPORT jobjectArray JNICALL +Java_org_dolphinemu_dolphinemu_features_input_model_CoreDevice_getOutputs(JNIEnv* env, jobject obj) +{ + return CoreDeviceControlVectorToJava(env, obj, (*GetDevicePointer(env, obj))->Outputs()); +} +} |
