This works by mapping gamepad keys to keyboard keys, just like PojavLauncher Android.
134 lines
5.8 KiB
Objective-C
134 lines
5.8 KiB
Objective-C
#import "KeyboardInput.h"
|
|
#import "../utils.h"
|
|
|
|
#include "../glfw_keycodes.h"
|
|
|
|
@implementation KeyboardInput
|
|
|
|
NSMutableDictionary* keycodeTable;
|
|
|
|
+ (void)initKeycodeTable {
|
|
if (@available(iOS 13.4, *)) {
|
|
keycodeTable = [[NSMutableDictionary alloc] init];
|
|
|
|
// A-Z keys
|
|
for (int i = UIKeyboardHIDUsageKeyboardA; i <= UIKeyboardHIDUsageKeyboardZ; i++) {
|
|
keycodeTable[@(i)] = @(i - UIKeyboardHIDUsageKeyboardA + GLFW_KEY_A);
|
|
}
|
|
|
|
// 0-9 keys
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboard0)] = @(GLFW_KEY_0);
|
|
for (int i = UIKeyboardHIDUsageKeyboard1; i <= UIKeyboardHIDUsageKeyboard9; i++) {
|
|
keycodeTable[@(i)] = @(i - UIKeyboardHIDUsageKeyboard1 + GLFW_KEY_1);
|
|
}
|
|
|
|
// Arrow keys
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardUpArrow)] = @(GLFW_KEY_DPAD_UP);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardDownArrow)] = @(GLFW_KEY_DPAD_DOWN);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardLeftArrow)] = @(GLFW_KEY_DPAD_LEFT);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardRightArrow)] = @(GLFW_KEY_DPAD_RIGHT);
|
|
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardComma)] = @(GLFW_KEY_COMMA);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardPeriod)] = @(GLFW_KEY_PERIOD);
|
|
|
|
// Alt keys
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardLeftAlt)] = @(GLFW_KEY_LEFT_ALT);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardRightAlt)] = @(GLFW_KEY_RIGHT_ALT);
|
|
|
|
// Control keys
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardLeftControl)] = @(GLFW_KEY_LEFT_CONTROL);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardRightControl)] = @(GLFW_KEY_RIGHT_CONTROL);
|
|
|
|
// Shift keys
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardLeftShift)] = @(GLFW_KEY_LEFT_SHIFT);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardRightShift)] = @(GLFW_KEY_RIGHT_SHIFT);
|
|
|
|
// Bracket keys
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardOpenBracket)] = @(GLFW_KEY_LEFT_BRACKET);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardCloseBracket)] = @(GLFW_KEY_RIGHT_BRACKET);
|
|
|
|
// Slash keys
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardSlash)] = @(GLFW_KEY_SLASH);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardBackslash)] = @(GLFW_KEY_BACKSLASH);
|
|
|
|
// Page keys
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardPageUp)] = @(GLFW_KEY_PAGE_UP);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardPageDown)] = @(GLFW_KEY_PAGE_DOWN);
|
|
|
|
// Some other keys
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardHome)] = @(GLFW_KEY_HOME);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardEscape)] = @(GLFW_KEY_ESCAPE);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardTab)] = @(GLFW_KEY_TAB);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardReturnOrEnter)] = @(GLFW_KEY_ENTER);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardSpacebar)] = @(GLFW_KEY_SPACE);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardDeleteOrBackspace)] = @(GLFW_KEY_BACKSPACE);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardDeleteForward)] = @(GLFW_KEY_DELETE);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardGraveAccentAndTilde)] = @(GLFW_KEY_GRAVE_ACCENT);
|
|
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardHyphen)] = @(GLFW_KEY_MINUS);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardEqualSign)] = @(GLFW_KEY_EQUAL);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardSemicolon)] = @(GLFW_KEY_SEMICOLON);
|
|
|
|
// Lock keys
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardCapsLock)] = @(GLFW_KEY_CAPS_LOCK);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeypadNumLock)] = @(GLFW_KEY_NUM_LOCK);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeyboardScrollLock)] = @(GLFW_KEY_SCROLL_LOCK);
|
|
|
|
// Numpad keys
|
|
keycodeTable[@(UIKeyboardHIDUsageKeypadSlash)] = @(GLFW_KEY_NUMPAD_DIVIDE);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeypadAsterisk)] = @(GLFW_KEY_NUMPAD_MULTIPLY);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeypadHyphen)] = @(GLFW_KEY_NUMPAD_SUBTRACT);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeypadPlus)] = @(GLFW_KEY_NUMPAD_ADD);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeypadEnter)] = @(GLFW_KEY_NUMPAD_ENTER);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeypadEqualSign)] = @(GLFW_KEY_NUMPAD_EQUAL);
|
|
keycodeTable[@(UIKeyboardHIDUsageKeypad0)] = @(GLFW_KEY_NUMPAD_0);
|
|
for (int i = UIKeyboardHIDUsageKeypad1; i <= UIKeyboardHIDUsageKeypad9; i++) {
|
|
keycodeTable[@(i)] = @(i - UIKeyboardHIDUsageKeypad1 + GLFW_KEY_NUMPAD_1);
|
|
}
|
|
|
|
// Function keys
|
|
for (int i = UIKeyboardHIDUsageKeyboardF1; i <= UIKeyboardHIDUsageKeyboardF12; i++) {
|
|
keycodeTable[@(i)] = @(i - UIKeyboardHIDUsageKeyboardF1 + GLFW_KEY_F1);
|
|
}
|
|
}
|
|
}
|
|
|
|
+ (BOOL)sendKeyEvent:(UIKey *)key down:(BOOL)isDown API_AVAILABLE(ios(13.4)) {
|
|
char modifiers = 0;
|
|
|
|
// convert UIKey's modifiers to GLFW
|
|
if (key.modifierFlags & UIKeyModifierAlphaShift) {
|
|
modifiers |= GLFW_MOD_CAPS_LOCK;
|
|
}
|
|
if (key.modifierFlags & UIKeyModifierShift) {
|
|
modifiers |= GLFW_MOD_SHIFT;
|
|
}
|
|
if (key.modifierFlags & UIKeyModifierAlternate) {
|
|
modifiers |= GLFW_MOD_ALT;
|
|
}
|
|
if (key.modifierFlags & UIKeyModifierControl) {
|
|
modifiers |= GLFW_MOD_CONTROL;
|
|
}
|
|
|
|
// send the keycode
|
|
int keycode = [keycodeTable[@(key.keyCode)] intValue];
|
|
if (keycode != 0) {
|
|
CallbackBridge_nativeSendKey(keycode, 0 /* scancode */, isDown, modifiers);
|
|
} else {
|
|
NSLog(@"KeyboardInput: Unhandled key %lu", (unsigned long)key.keyCode);
|
|
}
|
|
|
|
// key.characters.length < 11: skip sending characters if the string starts with UIKeyInput
|
|
if (isDown && key.characters.length < 11) {
|
|
for (int i = 0; i < key.characters.length; i++) {
|
|
int keychar = [key.characters characterAtIndex:i];
|
|
CallbackBridge_nativeSendCharMods(keychar, modifiers);
|
|
CallbackBridge_nativeSendChar(keychar);
|
|
}
|
|
}
|
|
|
|
return keycode != 0 || isDown;
|
|
}
|
|
|
|
@end
|