mirror of
https://github.com/geode-sdk/geode.git
synced 2025-02-17 00:30:26 -05:00
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:
parent
5037a9b7cb
commit
a93ddd4c4a
3 changed files with 206 additions and 14 deletions
|
@ -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
|
||||
|
|
157
loader/src/platform/android/input.cpp
Normal file
157
loader/src/platform/android/input.cpp
Normal 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);
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue