Implement callbacks for Android keyboard inputs (#507)

* add android input callbacks

* make platformcapability a bool

* fix method signature

* scroll tweaks
This commit is contained in:
Chloe 2024-02-12 06:53:14 -07:00 committed by GitHub
parent 5037a9b7cb
commit a93ddd4c4a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 206 additions and 14 deletions

View file

@ -21,8 +21,8 @@ RT_ADD(
static enumKeyCodes convertKeyCode(enumKeyCodes key);
bool dispatchKeyboardMSG(enumKeyCodes key, bool, bool);
bool dispatchKeyboardMSG(enumKeyCodes key, bool isKeyDown, bool isKeyRepeat);
inline bool getAltKeyPressed() const {
return m_bAltPressed;
}
@ -42,21 +42,28 @@ RT_ADD(
void updateModifierKeys(bool shft, bool ctrl, bool alt, bool cmd);
bool getBlockRepeat() const;
void setBlockRepeat(bool);
inline bool getBlockRepeat() const {
return m_bBlockRepeat;
}
inline void setBlockRepeat(bool blockRepeat) {
this->m_bBlockRepeat = blockRepeat;
}
protected:
CCArray* m_pDelegates; // 0x20
bool m_bUnknown24; // 0x24
bool m_bUnknown25; // 0x25
ccCArray* m_pUnknown28; // 0x28
ccCArray* m_pUnknown2c; // 0x2c
bool m_bShiftPressed; // 0x30
bool m_bControlPressed; // 0x31
bool m_bAltPressed; // 0x32
bool m_bCommandPressed; // 0x33
//there's more here, check the initializer
CCArray* m_pDelegates; // 0x34
bool m_bUnknown38; // 0x38
bool m_bUnknown39; // 0x39
bool m_bUnknown3a; // 0x3a
ccCArray* m_pUnknown3c; // 0x3c
ccCArray* m_pUnknown40; // 0x40
bool m_bShiftPressed; // 0x44
bool m_bControlPressed; // 0x45
bool m_bAltPressed; // 0x46
bool m_bCommandPressed; // 0x47
bool m_bBlockRepeat; // 0x48
// ~~there's more here, check the initializer~~ no there's not??
};
NS_CC_END

View file

@ -0,0 +1,157 @@
#include <unordered_map>
#include <android/keycodes.h>
#include <jni.h>
namespace {
std::unordered_map<int, cocos2d::enumKeyCodes> g_keymap = {
{AKEYCODE_ESCAPE, cocos2d::KEY_Escape},
{AKEYCODE_SPACE, cocos2d::KEY_Space},
{AKEYCODE_DPAD_LEFT, cocos2d::KEY_Left},
{AKEYCODE_DPAD_RIGHT, cocos2d::KEY_Right},
{AKEYCODE_DPAD_UP, cocos2d::KEY_Up},
{AKEYCODE_DPAD_DOWN, cocos2d::KEY_Down},
{AKEYCODE_0, cocos2d::KEY_Zero},
{AKEYCODE_1, cocos2d::KEY_One},
{AKEYCODE_2, cocos2d::KEY_Two},
{AKEYCODE_3, cocos2d::KEY_Three},
{AKEYCODE_4, cocos2d::KEY_Four},
{AKEYCODE_5, cocos2d::KEY_Five},
{AKEYCODE_6, cocos2d::KEY_Six},
{AKEYCODE_7, cocos2d::KEY_Seven},
{AKEYCODE_8, cocos2d::KEY_Eight},
{AKEYCODE_9, cocos2d::KEY_Nine},
{AKEYCODE_Q, cocos2d::KEY_Q},
{AKEYCODE_W, cocos2d::KEY_W},
{AKEYCODE_E, cocos2d::KEY_E},
{AKEYCODE_R, cocos2d::KEY_R},
{AKEYCODE_T, cocos2d::KEY_T},
{AKEYCODE_Y, cocos2d::KEY_Y},
{AKEYCODE_A, cocos2d::KEY_A},
{AKEYCODE_S, cocos2d::KEY_S},
{AKEYCODE_D, cocos2d::KEY_D},
{AKEYCODE_F, cocos2d::KEY_F},
{AKEYCODE_G, cocos2d::KEY_G},
{AKEYCODE_H, cocos2d::KEY_H},
{AKEYCODE_J, cocos2d::KEY_J},
{AKEYCODE_K, cocos2d::KEY_K},
{AKEYCODE_L, cocos2d::KEY_L},
{AKEYCODE_Z, cocos2d::KEY_Z},
{AKEYCODE_X, cocos2d::KEY_X},
{AKEYCODE_C, cocos2d::KEY_C},
{AKEYCODE_V, cocos2d::KEY_V},
{AKEYCODE_B, cocos2d::KEY_B},
{AKEYCODE_N, cocos2d::KEY_N},
{AKEYCODE_M, cocos2d::KEY_M},
{AKEYCODE_F1, cocos2d::KEY_F1},
{AKEYCODE_F2, cocos2d::KEY_F2},
{AKEYCODE_F3, cocos2d::KEY_F3},
{AKEYCODE_F4, cocos2d::KEY_F4},
{AKEYCODE_F5, cocos2d::KEY_F5},
{AKEYCODE_F6, cocos2d::KEY_F6},
{AKEYCODE_F7, cocos2d::KEY_F7},
{AKEYCODE_F8, cocos2d::KEY_F8},
{AKEYCODE_F9, cocos2d::KEY_F9},
{AKEYCODE_F10, cocos2d::KEY_F10},
{AKEYCODE_F11, cocos2d::KEY_F11},
{AKEYCODE_F12, cocos2d::KEY_F12},
{AKEYCODE_ENTER, cocos2d::KEY_Enter},
{AKEYCODE_FORWARD_DEL, cocos2d::KEY_Delete},
{AKEYCODE_DEL, cocos2d::KEY_Backspace},
{AKEYCODE_CTRL_LEFT, cocos2d::KEY_LeftControl},
{AKEYCODE_CTRL_RIGHT, cocos2d::KEY_RightContol}, // sic
{AKEYCODE_SHIFT_LEFT, cocos2d::KEY_LeftShift},
{AKEYCODE_SHIFT_RIGHT, cocos2d::KEY_RightShift},
{AKEYCODE_ALT_LEFT, cocos2d::KEY_Alt},
{AKEYCODE_ALT_RIGHT, cocos2d::KEY_Alt},
{AKEYCODE_BUTTON_A, cocos2d::CONTROLLER_A},
{AKEYCODE_BUTTON_B, cocos2d::CONTROLLER_B},
{AKEYCODE_BUTTON_X, cocos2d::CONTROLLER_X},
{AKEYCODE_BUTTON_Y, cocos2d::CONTROLLER_Y},
{AKEYCODE_BUTTON_START, cocos2d::CONTROLLER_Start},
{AKEYCODE_BUTTON_SELECT, cocos2d::CONTROLLER_Back},
{AKEYCODE_BUTTON_R1, cocos2d::CONTROLLER_RB},
{AKEYCODE_BUTTON_L1, cocos2d::CONTROLLER_LB},
{AKEYCODE_BUTTON_R2, cocos2d::CONTROLLER_RT},
{AKEYCODE_BUTTON_L2, cocos2d::CONTROLLER_LT},
};
cocos2d::enumKeyCodes translateAndroidKeyCodeToWindows(int keyCode) {
if (auto it = g_keymap.find(keyCode); it != g_keymap.end()) {
return it->second;
}
else {
return cocos2d::KEY_None;
}
}
}
extern "C" JNIEXPORT void JNICALL
Java_com_geode_launcher_utils_GeodeUtils_nativeKeyDown(
JNIEnv* env, jobject, jint keycode, jint modifiers, jboolean isRepeat
) {
if (keycode != AKEYCODE_BACK && keycode != AKEYCODE_MENU) {
auto keyboard_dispatcher = cocos2d::CCDirector::sharedDirector()->getKeyboardDispatcher();
auto translated_code = translateAndroidKeyCodeToWindows(keycode);
auto isShiftPressed = modifiers & 0x1;
auto isCtrlPressed = modifiers & 0x1000;
auto isAltPressed = modifiers & 0x2;
keyboard_dispatcher->updateModifierKeys(isShiftPressed, isCtrlPressed, isAltPressed, false);
keyboard_dispatcher->dispatchKeyboardMSG(translated_code, true, isRepeat);
} else {
auto keypad_dispatcher = cocos2d::CCDirector::sharedDirector()->getKeypadDispatcher();
if (keycode == AKEYCODE_BACK) {
keypad_dispatcher->dispatchKeypadMSG(cocos2d::kTypeBackClicked);
} else {
keypad_dispatcher->dispatchKeypadMSG(cocos2d::kTypeMenuClicked);
}
}
}
extern "C" JNIEXPORT void JNICALL Java_com_geode_launcher_utils_GeodeUtils_nativeKeyUp(
JNIEnv* env, jobject, jint keycode, jint modifiers
) {
// back/menu keys
if (keycode != AKEYCODE_BACK && keycode != AKEYCODE_MENU) {
auto keyboard_dispatcher = cocos2d::CCDirector::sharedDirector()->getKeyboardDispatcher();
auto translated_code = translateAndroidKeyCodeToWindows(keycode);
auto isShiftPressed = modifiers & 0x1;
auto isCtrlPressed = modifiers & 0x1000;
auto isAltPressed = modifiers & 0x2;
keyboard_dispatcher->updateModifierKeys(
isShiftPressed,
isCtrlPressed,
isAltPressed,
false
);
keyboard_dispatcher->dispatchKeyboardMSG(translated_code, false, false);
}
}
constexpr auto g_scrollFactor = -13.0f;
extern "C" JNIEXPORT void JNICALL Java_com_geode_launcher_utils_GeodeUtils_nativeActionScroll(
JNIEnv* env, jobject, jfloat scrollX, jfloat scrollY
) {
cocos2d::CCDirector::sharedDirector()->getMouseDispatcher()->dispatchScrollMSG(
scrollY * g_scrollFactor, scrollX * g_scrollFactor
);
}
extern "C" JNIEXPORT void JNICALL Java_com_geode_launcher_utils_GeodeUtils_resizeSurface(
JNIEnv* env, jobject, jint width, jint height
) {
auto fWidth = static_cast<float>(width);
auto fHeight = static_cast<float>(height);
cocos2d::CCEGLView::sharedOpenGLView()->setFrameSize(fWidth, fHeight);
cocos2d::CCDirector::sharedDirector()->updateScreenScale({fWidth, fHeight});
cocos2d::CCDirector::sharedDirector()->setViewport();
cocos2d::CCDirector::sharedDirector()->setProjection(cocos2d::kCCDirectorProjection2D);
}

View file

@ -2,6 +2,7 @@
#include "../load.hpp"
#include <jni.h>
#include <Geode/cocos/platform/android/jni/JniHelper.h>
#include "internalString.hpp"
#include <cocos2d.h>
#include <Geode/loader/Log.hpp>
@ -16,6 +17,31 @@ PFNGLGENVERTEXARRAYSOESPROC glGenVertexArraysOESEXT = 0;
PFNGLBINDVERTEXARRAYOESPROC glBindVertexArrayOESEXT = 0;
PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArraysOESEXT = 0;
namespace {
bool reportPlatformCapability(std::string id) {
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t, "com/geode/launcher/utils/GeodeUtils", "reportPlatformCapability", "(Ljava/lang/String;)Z")) {
jstring stringArg1 = t.env->NewStringUTF(id.c_str());
auto r = t.env->CallStaticBooleanMethod(t.classID, t.methodID, stringArg1);
t.env->DeleteLocalRef(stringArg1);
t.env->DeleteLocalRef(t.classID);
return r;
} else {
auto vm = JniHelper::getJavaVM();
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) == JNI_OK) {
env->ExceptionClear();
}
}
return false;
}
}
extern "C" [[gnu::visibility("default")]] jint JNI_OnLoad(JavaVM* vm, void* reserved) {
glGenVertexArraysOESEXT = (PFNGLGENVERTEXARRAYSOESPROC)eglGetProcAddress("glGenVertexArraysOES");
glBindVertexArrayOESEXT = (PFNGLBINDVERTEXARRAYOESPROC)eglGetProcAddress("glBindVertexArrayOES");
@ -36,6 +62,8 @@ extern "C" [[gnu::visibility("default")]] jint JNI_OnLoad(JavaVM* vm, void* rese
delete cc;
}
reportPlatformCapability("extended_input");
geodeEntry(nullptr);
return JNI_VERSION_1_6;
}