Skip to content

Commit 282f5c3

Browse files
committed
feat(mac): Change how key code is calculated
1 parent 7e548bb commit 282f5c3

File tree

2 files changed

+36
-19
lines changed

2 files changed

+36
-19
lines changed

CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ set(SRC_FILES ${SRC_FILES}
1616
)
1717

1818
if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
19-
set(SRC_FILES ${SRC_FILES} src/macos.mm)
20-
set_source_files_properties(src/macos.mm PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
19+
set(SRC_FILES ${SRC_FILES} ${SRC_DIR}/macos.mm)
20+
set_source_files_properties(${SRC_DIR}/macos.mm PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
2121
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
22-
set(SRC_FILES ${SRC_FILES} src/windows.cpp)
22+
set(SRC_FILES ${SRC_FILES} ${SRC_DIR}/windows.cpp)
2323
else()
2424
message(FATAL_ERROR "Unsupported mod platform!")
2525
endif()

src/macos.mm

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
4443
void 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;
166181
void 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

Comments
 (0)