Files
PojavLauncher_iOS/Natives/input/KeyboardInput.m
T
Duy Tran Khanh 97c2f4b473 Added controller input (not tested)
This works by mapping gamepad keys to keyboard keys, just like
PojavLauncher Android.
2022-08-28 21:47:25 +07:00

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