@@ -22,25 +22,24 @@ inline bool keyDown(PlatformKey key, NSEvent* event)
2222 switch (key)
2323 {
2424 case BI::PlatformKey::LEFT_CONTROL:
25- return ( [event modifierFlags ] & NSCommandKeyMask ) ;
25+ return [event modifierFlags ] & NSCommandKeyMask ;
2626 case BI::PlatformKey::LEFT_SHIFT:
27- return ( [event modifierFlags ] & NSShiftKeyMask ) ;
27+ return [event modifierFlags ] & NSShiftKeyMask ;
2828 }
2929
3030 return false ;
3131 }
3232}
3333
34- #define HOOK_OBJC_METHOD (klass, cleanFuncName, funcName ) \
35- auto cleanFuncName ## Method = class_getInstanceMethod (objc_getClass (# klass) , @selector (funcName )); \
34+ #define HOOK_OBJC_METHOD (klass, type, cleanFuncName, funcName ) \
35+ auto cleanFuncName ## Method = class_getInstanceMethod (klass, @selector (funcName )); \
3636 cleanFuncName ## OIMP = method_getImplementation (cleanFuncName ## Method ); \
37- method_setImplementation (cleanFuncName ## Method , (EventType<klass> )&funcName);
37+ method_setImplementation (cleanFuncName ## Method , (type )&funcName);
3838
39- template <typename T>
40- using EventType = void (*)(T*, SEL , NSEvent *);
39+ using KeyEventType = void (*)(EAGLView*, SEL , NSEvent *);
4140
4241
43- static EventType<EAGLView> keyDownExecOIMP;
42+ static KeyEventType keyDownExecOIMP;
4443void keyDownExec (EAGLView* self, SEL sel, NSEvent * event) {
4544 if (!g_selectedInput)
4645 keyDownExecOIMP (self, sel, event);
@@ -91,10 +90,6 @@ void keyDownExec(EAGLView* self, SEL sel, NSEvent* event) {
9190 !BI::platform::keyDown (BI::PlatformKey::LEFT_CONTROL, event) &&
9291 BI::platform::keyDown (BI::PlatformKey::LEFT_SHIFT, event)
9392 ) {
94- int code = [[event characters ] length ] > 0
95- ? [[event characters ] characterAtIndex: 0 ];
96- : [[event charactersIgnoringModifiers ] characterAtIndex: 0 ];
97-
9893 switch ([event keyCode ])
9994 {
10095 case kVK_Delete :
@@ -106,6 +101,26 @@ void keyDownExec(EAGLView* self, SEL sel, NSEvent* event) {
106101 break ;
107102 }
108103
104+ /*
105+ int code = [[event characters] length] > 0
106+ ? [[event characters] characterAtIndex:0]
107+ : [[event charactersIgnoringModifiers] length] > 0
108+ ? [[event charactersIgnoringModifiers] characterAtIndex:0]
109+ : 0;
110+ */
111+
112+ int code = 0 ;
113+ {
114+ NSString * s = [event characters ];
115+ code = [s length ] > 0 ? [s characterAtIndex: 0 ] : 0 ;
116+
117+ if (code == 0 )
118+ {
119+ s = [event charactersIgnoringModifiers ];
120+ code = [s length ] > 0 ? [s characterAtIndex: 0 ] : 0 ;
121+ }
122+ }
123+
109124 switch (code)
110125 {
111126 case ' a' : case ' A' :
@@ -143,7 +158,7 @@ void keyDownExec(EAGLView* self, SEL sel, NSEvent* event) {
143158
144159 case kVK_End :
145160 g_selectedInput->onEndKey (
146- BI::platform::keyDown (BI::PlatformKey::LEFT_SHIFT)
161+ BI::platform::keyDown (BI::PlatformKey::LEFT_SHIFT, event )
147162 );
148163 break ;
149164
@@ -162,7 +177,7 @@ void keyDownExec(EAGLView* self, SEL sel, NSEvent* event) {
162177 }
163178}
164179
165- static EventType<EAGLView> keyUpExecOIMP;
180+ static KeyEventType keyUpExecOIMP;
166181void keyUpExec (EAGLView* self, SEL sel, NSEvent * event) {
167182 if (!g_selectedInput)
168183 keyUpExec (self, sel, event);
@@ -203,8 +218,10 @@ void touches(cocos2d::CCSet* touches, cocos2d::CCEvent* event, unsigned int type
203218
204219$on_mod(Loaded)
205220{
206- HOOK_OBJC_METHOD (EAGLView, keyDownExec, keyDownExec:);
207- HOOK_OBJC_METHOD (EAGLView, keyUpExec, keyUpExec:);
221+ auto eaglView = objc_getClass (" EAGLView" );
222+
223+ HOOK_OBJC_METHOD (eaglView, KeyEventType, keyDownExec, keyDownExec:);
224+ HOOK_OBJC_METHOD (eaglView, KeyEventType, keyUpExec, keyUpExec:);
208225}
209226
210227#endif
0 commit comments