1
+ #include < Geode/DefaultInclude.hpp>
2
+
3
+ #ifdef GEODE_IS_WINDOWS
4
+ #include < Geode/cocos/robtop/glfw/glfw3.h>
5
+ #include < Geode/cocos/robtop/keyboard_dispatcher/CCKeyboardDispatcher.h>
6
+ #include < Geode/cocos/robtop/keyboard_dispatcher/CCKeyboardDelegate.h>
7
+ #include < Geode/cocos/text_input_node/CCIMEDispatcher.h>
8
+ #include < Geode/modify/Modify.hpp>
9
+ #include < Geode/modify/CCEGLView.hpp>
10
+ #include < Geode/modify/CCKeyboardDispatcher.hpp>
11
+
12
+ using namespace geode ::prelude;
13
+
14
+ class $modify(GeodeCCEGLView, CCEGLView) {
15
+ void onGLFWKeyCallback (GLFWwindow* window, int key, int scancode, int action, int mods) {
16
+ bool extraKey = isExtraKey (key);
17
+ bool numpad = isKeyNumpad (key);
18
+ if (!extraKey && !numpad) {
19
+ return CCEGLView::onGLFWKeyCallback (window, key, scancode, action, mods);
20
+ }
21
+ if (CCIMEDispatcher::sharedDispatcher ()->hasDelegate ()) {
22
+ return CCEGLView::onGLFWKeyCallback (window, key, scancode, action, mods);
23
+ }
24
+ bool down = action == 1 || action == 2 ;
25
+ bool repeat = action == 2 ;
26
+ enumKeyCodes keyCode = enumKeyCodes::KEY_Unknown;
27
+ if (extraKey) {
28
+ keyCode = this ->extraKeyToKeyCode (key);
29
+ }
30
+ if (numpad) {
31
+ keyCode = this ->numpadToKeyCode (key);
32
+ }
33
+ CCKeyboardDispatcher::get ()->dispatchKeyboardMSG (keyCode, down, repeat);
34
+ }
35
+
36
+ void onGLFWMouseCallBack (GLFWwindow* window, int button, int action, int mods) {
37
+ if (!isExtraMouseButton (button)) {
38
+ return CCEGLView::onGLFWMouseCallBack (window, button, action, mods);
39
+ }
40
+ bool down = action == 1 ;
41
+ // mouse buttons never repeat
42
+ bool repeat = false ;
43
+ enumKeyCodes keyCode = this ->mouseButtonToKeyCode (button);
44
+ CCKeyboardDispatcher::get ()->dispatchKeyboardMSG (keyCode, down, repeat);
45
+ }
46
+
47
+ bool isExtraMouseButton (int code) {
48
+ return code > GLFW_MOUSE_BUTTON_3;
49
+ }
50
+
51
+ enumKeyCodes mouseButtonToKeyCode (int button) {
52
+ switch (button) {
53
+ case GLFW_MOUSE_BUTTON_4:
54
+ return enumKeyCodes::MOUSE_4;
55
+ case GLFW_MOUSE_BUTTON_5:
56
+ return enumKeyCodes::MOUSE_5;
57
+ case GLFW_MOUSE_BUTTON_6:
58
+ return enumKeyCodes::MOUSE_6;
59
+ case GLFW_MOUSE_BUTTON_7:
60
+ return enumKeyCodes::MOUSE_7;
61
+ case GLFW_MOUSE_BUTTON_8:
62
+ return enumKeyCodes::MOUSE_8;
63
+ default :
64
+ return enumKeyCodes::KEY_Unknown;
65
+ }
66
+ }
67
+
68
+ bool isExtraKey (int code) {
69
+ switch (code) {
70
+ case GLFW_KEY_WORLD_1:
71
+ case GLFW_KEY_WORLD_2:
72
+ case GLFW_KEY_SEMICOLON:
73
+ case GLFW_KEY_APOSTROPHE:
74
+ case GLFW_KEY_SLASH:
75
+ case GLFW_KEY_EQUAL:
76
+ case GLFW_KEY_LEFT_BRACKET:
77
+ case GLFW_KEY_BACKSLASH:
78
+ case GLFW_KEY_RIGHT_BRACKET:
79
+ case GLFW_KEY_GRAVE_ACCENT:
80
+ return true ;
81
+ default :
82
+ return false ;
83
+ }
84
+ }
85
+
86
+ enumKeyCodes extraKeyToKeyCode (int key) {
87
+ switch (key) {
88
+ case GLFW_KEY_SEMICOLON:
89
+ return enumKeyCodes::KEY_Semicolon;
90
+ case GLFW_KEY_APOSTROPHE:
91
+ return enumKeyCodes::KEY_Apostrophe;
92
+ case GLFW_KEY_SLASH:
93
+ return enumKeyCodes::KEY_Slash;
94
+ case GLFW_KEY_EQUAL:
95
+ return enumKeyCodes::KEY_OEMEqual;
96
+ case GLFW_KEY_LEFT_BRACKET:
97
+ return enumKeyCodes::KEY_LeftBracket;
98
+ case GLFW_KEY_BACKSLASH:
99
+ return enumKeyCodes::KEY_Backslash;
100
+ case GLFW_KEY_RIGHT_BRACKET:
101
+ return enumKeyCodes::KEY_RightBracket;
102
+ case GLFW_KEY_GRAVE_ACCENT:
103
+ return enumKeyCodes::KEY_GraveAccent;
104
+ case GLFW_KEY_WORLD_1:
105
+ return enumKeyCodes::KEY_World1;
106
+ case GLFW_KEY_WORLD_2:
107
+ return enumKeyCodes::KEY_World2;
108
+ default :
109
+ return enumKeyCodes::KEY_Unknown;
110
+ }
111
+ }
112
+
113
+ bool isKeyNumpad (int code) {
114
+ return code >= GLFW_KEY_KP_0 && code <= GLFW_KEY_KP_EQUAL;
115
+ }
116
+
117
+ enumKeyCodes numpadToKeyCode (int key) {
118
+ switch (key) {
119
+ case GLFW_KEY_KP_0:
120
+ return enumKeyCodes::KEY_NumPad0;
121
+ case GLFW_KEY_KP_1:
122
+ return enumKeyCodes::KEY_NumPad1;
123
+ case GLFW_KEY_KP_2:
124
+ return enumKeyCodes::KEY_NumPad2;
125
+ case GLFW_KEY_KP_3:
126
+ return enumKeyCodes::KEY_NumPad3;
127
+ case GLFW_KEY_KP_4:
128
+ return enumKeyCodes::KEY_NumPad4;
129
+ case GLFW_KEY_KP_5:
130
+ return enumKeyCodes::KEY_NumPad5;
131
+ case GLFW_KEY_KP_6:
132
+ return enumKeyCodes::KEY_NumPad6;
133
+ case GLFW_KEY_KP_7:
134
+ return enumKeyCodes::KEY_NumPad7;
135
+ case GLFW_KEY_KP_8:
136
+ return enumKeyCodes::KEY_NumPad8;
137
+ case GLFW_KEY_KP_9:
138
+ return enumKeyCodes::KEY_NumPad9;
139
+ case GLFW_KEY_KP_DECIMAL:
140
+ return enumKeyCodes::KEY_Decimal;
141
+ case GLFW_KEY_KP_DIVIDE:
142
+ return enumKeyCodes::KEY_Divide;
143
+ case GLFW_KEY_KP_MULTIPLY:
144
+ return enumKeyCodes::KEY_Multiply;
145
+ case GLFW_KEY_KP_SUBTRACT:
146
+ return enumKeyCodes::KEY_Subtract;
147
+ case GLFW_KEY_KP_ADD:
148
+ return enumKeyCodes::KEY_Add;
149
+ case GLFW_KEY_KP_ENTER:
150
+ return enumKeyCodes::KEY_NumEnter;
151
+ case GLFW_KEY_KP_EQUAL:
152
+ return enumKeyCodes::KEY_Equal;
153
+ default :
154
+ return enumKeyCodes::KEY_Unknown;
155
+ }
156
+ }
157
+ };
158
+
159
+ class $modify(CCKeyboardDispatcher) {
160
+ GEODE_FORWARD_COMPAT_DISABLE_HOOKS (" CCKeyboardDispatcher new keys" )
161
+
162
+ const char * keyToString (enumKeyCodes key) {
163
+ if (key < 0x1000 ) {
164
+ return CCKeyboardDispatcher::keyToString (key);
165
+ }
166
+
167
+ switch (key) {
168
+ case KEY_GraveAccent:
169
+ return " `" ;
170
+ case KEY_OEMEqual:
171
+ return " =" ;
172
+ case KEY_LeftBracket:
173
+ return " [" ;
174
+ case KEY_RightBracket:
175
+ return " ]" ;
176
+ case KEY_Backslash:
177
+ return " \\ " ;
178
+ case KEY_Semicolon:
179
+ return " ;" ;
180
+ case KEY_Apostrophe:
181
+ return " '" ;
182
+ case KEY_Slash:
183
+ return " /" ;
184
+ case KEY_NumEnter:
185
+ return " NumEnter" ;
186
+ case KEY_World1:
187
+ return " INTL-1" ;
188
+ case KEY_World2:
189
+ return " INTL-2" ;
190
+ case MOUSE_4:
191
+ return " Mouse 4" ;
192
+ case MOUSE_5:
193
+ return " Mouse 5" ;
194
+ case MOUSE_6:
195
+ return " Mouse 6" ;
196
+ case MOUSE_7:
197
+ return " Mouse 7" ;
198
+ case MOUSE_8:
199
+ return " Mouse 8" ;
200
+ default :
201
+ return CCKeyboardDispatcher::keyToString (KEY_Unknown);
202
+ }
203
+ }
204
+ };
205
+
206
+ #endif
0 commit comments