5
5
#include < Geode/DefaultInclude.hpp>
6
6
#include < Geode/cocos/robtop/keyboard_dispatcher/CCKeyboardDispatcher.h>
7
7
#include < Geode/cocos/robtop/keyboard_dispatcher/CCKeyboardDelegate.h>
8
+ #import < Geode/cocos/platform/mac/EAGLView.h>
8
9
#include < Geode/cocos/text_input_node/CCIMEDispatcher.h>
9
10
#include < Geode/modify/Modify.hpp>
10
11
#include < Geode/modify/CCKeyboardDispatcher.hpp>
@@ -126,15 +127,16 @@ bool isKeyNumpad(NSEvent* event) {
126
127
}
127
128
128
129
129
- static void (*s_keyDownExecOrig)(void *, SEL , NSEvent *);
130
- void keyDownExecHook (void * self, SEL sel, NSEvent * event) {
130
+ void keyDownExecHook (EAGLView* self, SEL sel, NSEvent * event) {
131
131
bool extraKey = isExtraKey (event);
132
132
bool numpad = isKeyNumpad (event);
133
133
if (!extraKey && !numpad) {
134
- return s_keyDownExecOrig (self, sel, event);
134
+ [self performSelector: sel withObject: event];
135
+ return ;
135
136
}
136
137
if (CCIMEDispatcher::sharedDispatcher ()->hasDelegate ()) {
137
- return s_keyDownExecOrig (self, sel, event);
138
+ [self performSelector: sel withObject: event];
139
+ return ;
138
140
}
139
141
140
142
enumKeyCodes keyCode = enumKeyCodes::KEY_Unknown;
@@ -147,15 +149,16 @@ void keyDownExecHook(void* self, SEL sel, NSEvent* event) {
147
149
CCKeyboardDispatcher::get ()->dispatchKeyboardMSG (keyCode, true , [event isARepeat ]);
148
150
}
149
151
150
- static void (*s_keyUpExecOrig)(void *, SEL , NSEvent *);
151
- void keyUpExecHook (void * self, SEL sel, NSEvent * event) {
152
+ void keyUpExecHook (EAGLView* self, SEL sel, NSEvent * event) {
152
153
bool extraKey = isExtraKey (event);
153
154
bool numpad = isKeyNumpad (event);
154
155
if (!extraKey && !numpad) {
155
- return s_keyUpExecOrig (self, sel, event);
156
+ [self performSelector: sel withObject: event];
157
+ return ;
156
158
}
157
159
if (CCIMEDispatcher::sharedDispatcher ()->hasDelegate ()) {
158
- return s_keyUpExecOrig (self, sel, event);
160
+ [self performSelector: sel withObject: event];
161
+ return ;
159
162
}
160
163
161
164
enumKeyCodes keyCode = enumKeyCodes::KEY_Unknown;
@@ -168,20 +171,20 @@ void keyUpExecHook(void* self, SEL sel, NSEvent* event) {
168
171
CCKeyboardDispatcher::get ()->dispatchKeyboardMSG (keyCode, false , [event isARepeat ]);
169
172
}
170
173
171
- static void (*s_mouseDownExecOrig)(void *, SEL , NSEvent *);
172
- void mouseDownExecHook (void * self, SEL sel, NSEvent * event) {
174
+ void mouseDownExecHook (EAGLView* self, SEL sel, NSEvent * event) {
173
175
if (!isExtraMouseButton (event)) {
174
- return s_mouseDownExecOrig (self, sel, event);
176
+ [self performSelector: sel withObject: event];
177
+ return ;
175
178
}
176
179
177
180
enumKeyCodes keyCode = mouseButtonToKeyCode (event);
178
181
CCKeyboardDispatcher::get ()->dispatchKeyboardMSG (keyCode, true , false );
179
182
}
180
183
181
- static void (*s_mouseUpExecOrig)(void *, SEL , NSEvent *);
182
- void mouseUpExecHook (void * self, SEL sel, NSEvent * event) {
184
+ void mouseUpExecHook (EAGLView* self, SEL sel, NSEvent * event) {
183
185
if (!isExtraMouseButton (event)) {
184
- return s_mouseUpExecOrig (self, sel, event);
186
+ [self performSelector: sel withObject: event];
187
+ return ;
185
188
}
186
189
187
190
enumKeyCodes keyCode = mouseButtonToKeyCode (event);
@@ -237,17 +240,16 @@ void mouseUpExecHook(void* self, SEL sel, NSEvent* event) {
237
240
};
238
241
239
242
240
- #define OBJC_SWIZZLE (klass, methodName ) \
241
- auto methodName##Method = class_getInstanceMethod (klass, @selector (methodName: )); \
242
- s_##methodName##Orig = reinterpret_cast <decltype(s_##methodName##Orig)>(method_getImplementation (methodName##Method )); \
243
- method_setImplementation (methodName##Method , reinterpret_cast <IMP >(&methodName##Hook));
243
+ #define HOOK_OBJC_METHOD (klass, methodName ) \
244
+ auto methodName##Addr = class_getInstanceMethod (klass, @selector (methodName: )); \
245
+ static_cast <void >(Mod::get()->hook (reinterpret_cast <void *>(method_getImplementation (methodName##Addr)), &methodName##Hook, #klass " " #methodName));
244
246
245
247
__attribute__ ((constructor)) void initialize_newKeyboardMSGKeysHooks() {
246
248
auto eaglView = objc_getClass (" EAGLView" );
247
249
248
- OBJC_SWIZZLE (eaglView, keyDownExec);
249
- OBJC_SWIZZLE (eaglView, keyUpExec);
250
+ HOOK_OBJC_METHOD (eaglView, keyDownExec);
251
+ HOOK_OBJC_METHOD (eaglView, keyUpExec);
250
252
251
- OBJC_SWIZZLE (eaglView, mouseDownExec);
252
- OBJC_SWIZZLE (eaglView, mouseUpExec);
253
+ HOOK_OBJC_METHOD (eaglView, mouseDownExec);
254
+ HOOK_OBJC_METHOD (eaglView, mouseUpExec);
253
255
}
0 commit comments