Skip to content

Commit ca2ece2

Browse files
SpaghettDevFleeym
andauthored
Add support for missing keys and mouse buttons, rewrite numpad input (#1258)
* add missing key codes and mouse buttons to enumKeyCodes * rewrite numpad key detection * add some INTL keys * ifdef the hook for desktop only * MacOS support * same-line brackets * unindent the enum by one indent * Manual Objective-C method hooks * Android keys * Incorrect enum field casing * the pch.. * ios support is not real :( * iOS support --------- Co-authored-by: Fleeym <[email protected]>
1 parent 96deea0 commit ca2ece2

File tree

5 files changed

+543
-1
lines changed

5 files changed

+543
-1
lines changed

Diff for: loader/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ file(GLOB SOURCES CONFIGURE_DEPENDS
9191
file(GLOB OBJC_SOURCES
9292
src/platform/Objcpp.mm
9393
src/load.mm
94+
95+
src/hooks/AddExtraKeys.mm
9496
)
9597
set_source_files_properties(${OBJC_SOURCES} PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
9698

Diff for: loader/include/Geode/cocos/robtop/keyboard_dispatcher/CCKeyboardDelegate.h

+22-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ NS_CC_BEGIN
1414
*/
1515
typedef enum
1616
{
17-
// this one might not actually exist in gd itself
1817
KEY_Unknown = -0x01,
1918
KEY_None = 0x00,
2019
KEY_Backspace = 0x08,
@@ -198,6 +197,28 @@ typedef enum
198197
CONTROLLER_RTHUMBSTICK_DOWN = 0x40F,
199198
CONTROLLER_RTHUMBSTICK_LEFT = 0x411,
200199
CONTROLLER_RTHUMBSTICK_RIGHT = 0x413,
200+
201+
// Geode additions
202+
KEY_GraveAccent = 0x1000,
203+
KEY_OEMEqual = 0x1001,
204+
KEY_LeftBracket = 0x1002,
205+
KEY_RightBracket = 0x1003,
206+
KEY_Backslash = 0x1004,
207+
KEY_Semicolon = 0x1005,
208+
KEY_Apostrophe = 0x1006,
209+
KEY_Slash = 0x1007,
210+
KEY_Equal = 0x1008,
211+
KEY_NumEnter = 0x1009,
212+
// Keys used by some non-US keyboard layouts
213+
KEY_World1 = 0x100A,
214+
KEY_World2 = 0x100B,
215+
216+
// Mouse buttons (excluding clicks)
217+
MOUSE_4 = 0x1100,
218+
MOUSE_5 = 0x1101,
219+
MOUSE_6 = 0x1102,
220+
MOUSE_7 = 0x1103,
221+
MOUSE_8 = 0x1104
201222
} enumKeyCodes;
202223

203224
// @note RobTop Addition

Diff for: loader/src/hooks/AddExtraKeys.cpp

+206
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
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

Comments
 (0)