From f0ba66fcd637325b1cc36d121e93a754624b079c Mon Sep 17 00:00:00 2001 From: imxieyi Date: Mon, 4 Sep 2017 15:05:46 +0800 Subject: [PATCH] add support for smart keyboard --- ios/PPSSPPUIApplication.h | 20 +++++++ ios/PPSSPPUIApplication.mm | 114 ++++++++++++++++++++++++++++++++++++ ios/SmartKeyboardMap.cpp | 78 ++++++++++++++++++++++++ ios/SmartKeyboardMap.hpp | 14 +++++ ios/ViewController.mm | 6 +- ios/iCade/iCadeReaderView.m | 8 +-- ios/main.mm | 5 +- 7 files changed, 236 insertions(+), 9 deletions(-) create mode 100644 ios/PPSSPPUIApplication.h create mode 100644 ios/PPSSPPUIApplication.mm create mode 100644 ios/SmartKeyboardMap.cpp create mode 100644 ios/SmartKeyboardMap.hpp diff --git a/ios/PPSSPPUIApplication.h b/ios/PPSSPPUIApplication.h new file mode 100644 index 0000000000..e7af973f14 --- /dev/null +++ b/ios/PPSSPPUIApplication.h @@ -0,0 +1,20 @@ +// +// PPSSPPUIApplication.h +// PPSSPP +// +// Created by xieyi on 2017/9/4. +// +// + +#ifndef PPSSPPUIApplication_h +#define PPSSPPUIApplication_h + +#import + +@interface PPSSPPUIApplication : UIApplication +{ +} +@end + + +#endif /* PPSSPPUIApplication_h */ diff --git a/ios/PPSSPPUIApplication.mm b/ios/PPSSPPUIApplication.mm new file mode 100644 index 0000000000..c535081b99 --- /dev/null +++ b/ios/PPSSPPUIApplication.mm @@ -0,0 +1,114 @@ +// +// PPSSPPUIApplication.m +// PPSSPP +// +// Created by xieyi on 2017/9/4. +// +// + +#import "PPSSPPUIApplication.h" + +#import +#import +#import + +#include "base/display.h" +#include "base/timeutil.h" +#include "file/zip_read.h" +#include "input/input_state.h" +#include "net/resolve.h" +#include "ui/screen.h" +#include "thin3d/thin3d.h" +#include "input/keycodes.h" +#include "gfx_es2/gpu_features.h" + +#import "ios/AppDelegate.h" +#include "ios/SmartKeyboardMap.hpp" + +#include "Core/Config.h" +#include "Common/GraphicsContext.h" + +#include +#include +#include + +#ifndef IS_IOS7 +#define IS_IOS7 ([[UIDevice currentDevice].systemVersion floatValue]>=7.0) +#endif +#ifndef IS_IOS9 +#define IS_IOS9 ([[UIDevice currentDevice].systemVersion floatValue]>=9.0) +#endif +#define IS_64BIT (sizeof(NSUInteger)==8) + +#define GSEVENT_TYPE 2 +#define GSEVENT_FLAGS (IS_64BIT?10:12) + +#define GSEVENTKEY_KEYCODE (IS_64BIT?(IS_IOS9?13:19):(IS_IOS7?17:15)) + +#define GSEVENT_TYPE_KEYUP 11 +#define GSEVENT_TYPE_KEYDOWN 10 +#define GSEVENT_TYPE_MODIFIER 12 + +#define GSEVENT_FLAG_LCMD 65536 // 0x00010000 +#define GSEVENT_FLAG_LSHIFT 131072 // 0x00020000 +#define GSEVENT_FLAG_LCTRL 1048576 // 0x00100000 +#define GSEVENT_FLAG_LALT 524288 // 0x00080000 + +#define GSEVENT_FLAG_RSHIFT 2097152 // 0x00200000 - not sent IOS9 +#define GSEVENT_FLAG_RCTRL 8388608 // 0x00800000 - not sent IOS9 +#define GSEVENT_FLAG_RALT 4194304 // 0x00400000 - not sent IOS9 + +@implementation PPSSPPUIApplication + +- (instancetype)init { + auto instance = [super init]; + instance.delegate = [[AppDelegate alloc] init]; + return instance; +} + +- (void)decodeKeyEvent:(NSInteger *)eventMem { + NSInteger eventType = eventMem[GSEVENT_TYPE]; + NSInteger eventScanCode = eventMem[GSEVENTKEY_KEYCODE]; + + //NSLog(@"Got key: %d", (int)eventScanCode); + + if (eventType == GSEVENT_TYPE_KEYUP) { + struct KeyInput key; + key.flags = KEY_UP; + key.keyCode = getSmartKeyboardMap((int)eventScanCode); + key.deviceId = DEVICE_ID_KEYBOARD; + NativeKey(key); + } else if (GSEVENT_TYPE_KEYDOWN) { + struct KeyInput key; + key.flags = KEY_DOWN; + key.keyCode = getSmartKeyboardMap((int)eventScanCode); + key.deviceId = DEVICE_ID_KEYBOARD; + NativeKey(key); + } + +} + +- (void)handleKeyUIEvent:(UIEvent *) event { + if ([event respondsToSelector:@selector(_gsEvent)]) { + NSInteger *eventMem; + + eventMem = (NSInteger *) (__bridge void*)[event performSelector:@selector(_gsEvent)]; + if (eventMem) { + [self decodeKeyEvent:eventMem]; + } + } +} + +- (void)sendEvent:(UIEvent *)event { + [super sendEvent:event]; + if ([event respondsToSelector:@selector(_gsEvent)]) { + NSInteger *eventMem; + + eventMem = (NSInteger *) (__bridge void*)[event performSelector:@selector(_gsEvent)]; + if (eventMem) { + [self decodeKeyEvent:eventMem]; + } + } +} + +@end diff --git a/ios/SmartKeyboardMap.cpp b/ios/SmartKeyboardMap.cpp new file mode 100644 index 0000000000..24579e5f8e --- /dev/null +++ b/ios/SmartKeyboardMap.cpp @@ -0,0 +1,78 @@ +// +// SmartKeyboardMap.cpp +// PPSSPP +// +// Created by xieyi on 2017/9/4. +// +// + +#include "SmartKeyboardMap.hpp" +#include "input/keycodes.h" + +int getSmartKeyboardMap(int keycode) { + switch(keycode) { + case 4: return NKCODE_A; + case 5: return NKCODE_B; + case 6: return NKCODE_C; + case 7: return NKCODE_D; + case 8: return NKCODE_E; + case 9: return NKCODE_F; + case 10: return NKCODE_G; + case 11: return NKCODE_H; + case 12: return NKCODE_I; + case 13: return NKCODE_J; + case 14: return NKCODE_K; + case 15: return NKCODE_L; + case 16: return NKCODE_M; + case 17: return NKCODE_N; + case 18: return NKCODE_O; + case 19: return NKCODE_P; + case 20: return NKCODE_Q; + case 21: return NKCODE_R; + case 22: return NKCODE_S; + case 23: return NKCODE_T; + case 24: return NKCODE_U; + case 25: return NKCODE_V; + case 26: return NKCODE_W; + case 27: return NKCODE_X; + case 28: return NKCODE_Y; + case 29: return NKCODE_Z; + case 30: return NKCODE_1; + case 31: return NKCODE_2; + case 32: return NKCODE_3; + case 33: return NKCODE_4; + case 34: return NKCODE_5; + case 35: return NKCODE_6; + case 36: return NKCODE_7; + case 37: return NKCODE_8; + case 38: return NKCODE_9; + case 39: return NKCODE_0; + case 40: return NKCODE_ENTER; + case 43: return NKCODE_TAB; + case 44: return NKCODE_SPACE; + case 45: return NKCODE_MINUS; + case 46: return NKCODE_EQUALS; + case 47: return NKCODE_LEFT_BRACKET; + case 48: return NKCODE_RIGHT_BRACKET; + case 49: return NKCODE_BACKSLASH; + case 51: return NKCODE_SEMICOLON; + case 52: return NKCODE_APOSTROPHE; + case 53: return NKCODE_ESCAPE;//NKCODE_GRAVE; + case 54: return NKCODE_COMMA; + case 55: return NKCODE_PERIOD; + case 56: return NKCODE_SLASH; + case 57: return NKCODE_CAPS_LOCK; + case 79: return NKCODE_DPAD_RIGHT; + case 80: return NKCODE_DPAD_LEFT; + case 81: return NKCODE_DPAD_DOWN; + case 82: return NKCODE_DPAD_UP; + case 224: return NKCODE_CTRL_LEFT; + case 225: return NKCODE_SHIFT_LEFT; + case 226: return NKCODE_META_LEFT; + case 227: return NKCODE_ALT_LEFT; + case 229: return NKCODE_SHIFT_RIGHT; + case 230: return NKCODE_META_RIGHT; + case 231: return NKCODE_ALT_RIGHT; + default: return 0; + } +} diff --git a/ios/SmartKeyboardMap.hpp b/ios/SmartKeyboardMap.hpp new file mode 100644 index 0000000000..bf6a3654a9 --- /dev/null +++ b/ios/SmartKeyboardMap.hpp @@ -0,0 +1,14 @@ +// +// SmartKeyboardMap.hpp +// PPSSPP +// +// Created by xieyi on 2017/9/4. +// +// + +#ifndef SmartKeyboardMap_hpp +#define SmartKeyboardMap_hpp + +int getSmartKeyboardMap(int keycode); + +#endif /* SmartKeyboardMap_hpp */ diff --git a/ios/ViewController.mm b/ios/ViewController.mm index 2832d10cc1..1cb6e5230f 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -74,7 +74,7 @@ static GraphicsContext *graphicsContext; @property (nonatomic) NSString* bundlePath; @property (nonatomic) NSMutableArray* touches; @property (nonatomic) AudioEngine* audioEngine; -@property (nonatomic) iCadeReaderView* iCadeView; +//@property (nonatomic) iCadeReaderView* iCadeView; #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1 @property (nonatomic) GCController *gameController __attribute__((weak_import)); #endif @@ -195,10 +195,10 @@ static GraphicsContext *graphicsContext; dp_xscale = (float)dp_xres / (float)pixel_xres; dp_yscale = (float)dp_yres / (float)pixel_yres; - self.iCadeView = [[iCadeReaderView alloc] init]; + /*self.iCadeView = [[iCadeReaderView alloc] init]; [self.view addSubview:self.iCadeView]; self.iCadeView.delegate = self; - self.iCadeView.active = YES; + self.iCadeView.active = YES;*/ #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1 if ([GCController class]) { diff --git a/ios/iCade/iCadeReaderView.m b/ios/iCade/iCadeReaderView.m index 019b70cbeb..48a0a59df3 100755 --- a/ios/iCade/iCadeReaderView.m +++ b/ios/iCade/iCadeReaderView.m @@ -85,12 +85,12 @@ static const char *OFF_STATES = "eczqtrfnmpgv"; _delegate = delegate; if (!_delegate) return; - _delegateFlags.stateChanged = [_delegate respondsToSelector:@selector(stateChanged:)]; + /*_delegateFlags.stateChanged = [_delegate respondsToSelector:@selector(stateChanged:)]; _delegateFlags.buttonDown = [_delegate respondsToSelector:@selector(buttonDown:)]; - _delegateFlags.buttonUp = [_delegate respondsToSelector:@selector(buttonUp:)]; + _delegateFlags.buttonUp = [_delegate respondsToSelector:@selector(buttonUp:)];*/ } -#pragma mark - +/*#pragma mark - #pragma mark UIKeyInput Protocol Methods - (BOOL)hasText { @@ -136,6 +136,6 @@ static const char *OFF_STATES = "eczqtrfnmpgv"; - (void)deleteBackward { // This space intentionally left blank to complete protocol -} +}*/ @end diff --git a/ios/main.mm b/ios/main.mm index 052b3773b4..3070e772d6 100644 --- a/ios/main.mm +++ b/ios/main.mm @@ -8,7 +8,7 @@ #import #import "AppDelegate.h" -#import +#import "PPSSPPUIApplication.h" #include "base/NativeApp.h" @@ -113,6 +113,7 @@ int main(int argc, char *argv[]) // Simulates a debugger. Makes it possible to use JIT (though only W^X) syscall(SYS_ptrace, 0 /*PTRACE_TRACEME*/, 0, 0, 0); @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + return UIApplicationMain(argc, argv, NSStringFromClass([PPSSPPUIApplication class]), nil); + //return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }