| 1 | /**************************************************************************/ |
| 2 | /* keyboard.h */ |
| 3 | /**************************************************************************/ |
| 4 | /* This file is part of: */ |
| 5 | /* GODOT ENGINE */ |
| 6 | /* https://godotengine.org */ |
| 7 | /**************************************************************************/ |
| 8 | /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ |
| 9 | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ |
| 10 | /* */ |
| 11 | /* Permission is hereby granted, free of charge, to any person obtaining */ |
| 12 | /* a copy of this software and associated documentation files (the */ |
| 13 | /* "Software"), to deal in the Software without restriction, including */ |
| 14 | /* without limitation the rights to use, copy, modify, merge, publish, */ |
| 15 | /* distribute, sublicense, and/or sell copies of the Software, and to */ |
| 16 | /* permit persons to whom the Software is furnished to do so, subject to */ |
| 17 | /* the following conditions: */ |
| 18 | /* */ |
| 19 | /* The above copyright notice and this permission notice shall be */ |
| 20 | /* included in all copies or substantial portions of the Software. */ |
| 21 | /* */ |
| 22 | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ |
| 23 | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ |
| 24 | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ |
| 25 | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ |
| 26 | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ |
| 27 | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ |
| 28 | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ |
| 29 | /**************************************************************************/ |
| 30 | |
| 31 | #ifndef KEYBOARD_H |
| 32 | #define KEYBOARD_H |
| 33 | |
| 34 | #include "core/string/ustring.h" |
| 35 | |
| 36 | // Keep the values in this enum in sync with `_keycodes` in `keyboard.cpp`, |
| 37 | // and the bindings in `core_constants.cpp`. |
| 38 | enum class Key { |
| 39 | NONE = 0, |
| 40 | // Special key: The strategy here is similar to the one used by toolkits, |
| 41 | // which consists in leaving the 21 bits unicode range for printable |
| 42 | // characters, and use the upper 11 bits for special keys and modifiers. |
| 43 | // This way everything (char/keycode) can fit nicely in one 32-bit |
| 44 | // integer (the enum's underlying type is `int` by default). |
| 45 | SPECIAL = (1 << 22), |
| 46 | /* CURSOR/FUNCTION/BROWSER/MULTIMEDIA/MISC KEYS */ |
| 47 | ESCAPE = SPECIAL | 0x01, |
| 48 | TAB = SPECIAL | 0x02, |
| 49 | BACKTAB = SPECIAL | 0x03, |
| 50 | BACKSPACE = SPECIAL | 0x04, |
| 51 | ENTER = SPECIAL | 0x05, |
| 52 | KP_ENTER = SPECIAL | 0x06, |
| 53 | INSERT = SPECIAL | 0x07, |
| 54 | KEY_DELETE = SPECIAL | 0x08, // "DELETE" is a reserved word on Windows. |
| 55 | PAUSE = SPECIAL | 0x09, |
| 56 | PRINT = SPECIAL | 0x0A, |
| 57 | SYSREQ = SPECIAL | 0x0B, |
| 58 | CLEAR = SPECIAL | 0x0C, |
| 59 | HOME = SPECIAL | 0x0D, |
| 60 | END = SPECIAL | 0x0E, |
| 61 | LEFT = SPECIAL | 0x0F, |
| 62 | UP = SPECIAL | 0x10, |
| 63 | RIGHT = SPECIAL | 0x11, |
| 64 | DOWN = SPECIAL | 0x12, |
| 65 | PAGEUP = SPECIAL | 0x13, |
| 66 | PAGEDOWN = SPECIAL | 0x14, |
| 67 | SHIFT = SPECIAL | 0x15, |
| 68 | CTRL = SPECIAL | 0x16, |
| 69 | META = SPECIAL | 0x17, |
| 70 | #if defined(MACOS_ENABLED) |
| 71 | CMD_OR_CTRL = META, |
| 72 | #else |
| 73 | CMD_OR_CTRL = CTRL, |
| 74 | #endif |
| 75 | ALT = SPECIAL | 0x18, |
| 76 | CAPSLOCK = SPECIAL | 0x19, |
| 77 | NUMLOCK = SPECIAL | 0x1A, |
| 78 | SCROLLLOCK = SPECIAL | 0x1B, |
| 79 | F1 = SPECIAL | 0x1C, |
| 80 | F2 = SPECIAL | 0x1D, |
| 81 | F3 = SPECIAL | 0x1E, |
| 82 | F4 = SPECIAL | 0x1F, |
| 83 | F5 = SPECIAL | 0x20, |
| 84 | F6 = SPECIAL | 0x21, |
| 85 | F7 = SPECIAL | 0x22, |
| 86 | F8 = SPECIAL | 0x23, |
| 87 | F9 = SPECIAL | 0x24, |
| 88 | F10 = SPECIAL | 0x25, |
| 89 | F11 = SPECIAL | 0x26, |
| 90 | F12 = SPECIAL | 0x27, |
| 91 | F13 = SPECIAL | 0x28, |
| 92 | F14 = SPECIAL | 0x29, |
| 93 | F15 = SPECIAL | 0x2A, |
| 94 | F16 = SPECIAL | 0x2B, |
| 95 | F17 = SPECIAL | 0x2C, |
| 96 | F18 = SPECIAL | 0x2D, |
| 97 | F19 = SPECIAL | 0x2E, |
| 98 | F20 = SPECIAL | 0x2F, |
| 99 | F21 = SPECIAL | 0x30, |
| 100 | F22 = SPECIAL | 0x31, |
| 101 | F23 = SPECIAL | 0x32, |
| 102 | F24 = SPECIAL | 0x33, |
| 103 | F25 = SPECIAL | 0x34, |
| 104 | F26 = SPECIAL | 0x35, |
| 105 | F27 = SPECIAL | 0x36, |
| 106 | F28 = SPECIAL | 0x37, |
| 107 | F29 = SPECIAL | 0x38, |
| 108 | F30 = SPECIAL | 0x39, |
| 109 | F31 = SPECIAL | 0x3A, |
| 110 | F32 = SPECIAL | 0x3B, |
| 111 | F33 = SPECIAL | 0x3C, |
| 112 | F34 = SPECIAL | 0x3D, |
| 113 | F35 = SPECIAL | 0x3E, |
| 114 | KP_MULTIPLY = SPECIAL | 0x81, |
| 115 | KP_DIVIDE = SPECIAL | 0x82, |
| 116 | KP_SUBTRACT = SPECIAL | 0x83, |
| 117 | KP_PERIOD = SPECIAL | 0x84, |
| 118 | KP_ADD = SPECIAL | 0x85, |
| 119 | KP_0 = SPECIAL | 0x86, |
| 120 | KP_1 = SPECIAL | 0x87, |
| 121 | KP_2 = SPECIAL | 0x88, |
| 122 | KP_3 = SPECIAL | 0x89, |
| 123 | KP_4 = SPECIAL | 0x8A, |
| 124 | KP_5 = SPECIAL | 0x8B, |
| 125 | KP_6 = SPECIAL | 0x8C, |
| 126 | KP_7 = SPECIAL | 0x8D, |
| 127 | KP_8 = SPECIAL | 0x8E, |
| 128 | KP_9 = SPECIAL | 0x8F, |
| 129 | = SPECIAL | 0x42, |
| 130 | HYPER = SPECIAL | 0x43, |
| 131 | HELP = SPECIAL | 0x45, |
| 132 | BACK = SPECIAL | 0x48, |
| 133 | FORWARD = SPECIAL | 0x49, |
| 134 | STOP = SPECIAL | 0x4A, |
| 135 | REFRESH = SPECIAL | 0x4B, |
| 136 | VOLUMEDOWN = SPECIAL | 0x4C, |
| 137 | VOLUMEMUTE = SPECIAL | 0x4D, |
| 138 | VOLUMEUP = SPECIAL | 0x4E, |
| 139 | MEDIAPLAY = SPECIAL | 0x54, |
| 140 | MEDIASTOP = SPECIAL | 0x55, |
| 141 | MEDIAPREVIOUS = SPECIAL | 0x56, |
| 142 | MEDIANEXT = SPECIAL | 0x57, |
| 143 | MEDIARECORD = SPECIAL | 0x58, |
| 144 | HOMEPAGE = SPECIAL | 0x59, |
| 145 | FAVORITES = SPECIAL | 0x5A, |
| 146 | SEARCH = SPECIAL | 0x5B, |
| 147 | STANDBY = SPECIAL | 0x5C, |
| 148 | OPENURL = SPECIAL | 0x5D, |
| 149 | LAUNCHMAIL = SPECIAL | 0x5E, |
| 150 | LAUNCHMEDIA = SPECIAL | 0x5F, |
| 151 | LAUNCH0 = SPECIAL | 0x60, |
| 152 | LAUNCH1 = SPECIAL | 0x61, |
| 153 | LAUNCH2 = SPECIAL | 0x62, |
| 154 | LAUNCH3 = SPECIAL | 0x63, |
| 155 | LAUNCH4 = SPECIAL | 0x64, |
| 156 | LAUNCH5 = SPECIAL | 0x65, |
| 157 | LAUNCH6 = SPECIAL | 0x66, |
| 158 | LAUNCH7 = SPECIAL | 0x67, |
| 159 | LAUNCH8 = SPECIAL | 0x68, |
| 160 | LAUNCH9 = SPECIAL | 0x69, |
| 161 | LAUNCHA = SPECIAL | 0x6A, |
| 162 | LAUNCHB = SPECIAL | 0x6B, |
| 163 | LAUNCHC = SPECIAL | 0x6C, |
| 164 | LAUNCHD = SPECIAL | 0x6D, |
| 165 | LAUNCHE = SPECIAL | 0x6E, |
| 166 | LAUNCHF = SPECIAL | 0x6F, |
| 167 | |
| 168 | GLOBE = SPECIAL | 0x70, |
| 169 | KEYBOARD = SPECIAL | 0x71, |
| 170 | JIS_EISU = SPECIAL | 0x72, |
| 171 | JIS_KANA = SPECIAL | 0x73, |
| 172 | |
| 173 | UNKNOWN = SPECIAL | 0x7FFFFF, |
| 174 | |
| 175 | /* PRINTABLE LATIN 1 CODES */ |
| 176 | |
| 177 | SPACE = 0x0020, |
| 178 | EXCLAM = 0x0021, |
| 179 | QUOTEDBL = 0x0022, |
| 180 | NUMBERSIGN = 0x0023, |
| 181 | DOLLAR = 0x0024, |
| 182 | PERCENT = 0x0025, |
| 183 | AMPERSAND = 0x0026, |
| 184 | APOSTROPHE = 0x0027, |
| 185 | PARENLEFT = 0x0028, |
| 186 | PARENRIGHT = 0x0029, |
| 187 | ASTERISK = 0x002A, |
| 188 | PLUS = 0x002B, |
| 189 | COMMA = 0x002C, |
| 190 | MINUS = 0x002D, |
| 191 | PERIOD = 0x002E, |
| 192 | SLASH = 0x002F, |
| 193 | KEY_0 = 0x0030, |
| 194 | KEY_1 = 0x0031, |
| 195 | KEY_2 = 0x0032, |
| 196 | KEY_3 = 0x0033, |
| 197 | KEY_4 = 0x0034, |
| 198 | KEY_5 = 0x0035, |
| 199 | KEY_6 = 0x0036, |
| 200 | KEY_7 = 0x0037, |
| 201 | KEY_8 = 0x0038, |
| 202 | KEY_9 = 0x0039, |
| 203 | COLON = 0x003A, |
| 204 | SEMICOLON = 0x003B, |
| 205 | LESS = 0x003C, |
| 206 | EQUAL = 0x003D, |
| 207 | GREATER = 0x003E, |
| 208 | QUESTION = 0x003F, |
| 209 | AT = 0x0040, |
| 210 | A = 0x0041, |
| 211 | B = 0x0042, |
| 212 | C = 0x0043, |
| 213 | D = 0x0044, |
| 214 | E = 0x0045, |
| 215 | F = 0x0046, |
| 216 | G = 0x0047, |
| 217 | H = 0x0048, |
| 218 | I = 0x0049, |
| 219 | J = 0x004A, |
| 220 | K = 0x004B, |
| 221 | L = 0x004C, |
| 222 | M = 0x004D, |
| 223 | N = 0x004E, |
| 224 | O = 0x004F, |
| 225 | P = 0x0050, |
| 226 | Q = 0x0051, |
| 227 | R = 0x0052, |
| 228 | S = 0x0053, |
| 229 | T = 0x0054, |
| 230 | U = 0x0055, |
| 231 | V = 0x0056, |
| 232 | W = 0x0057, |
| 233 | X = 0x0058, |
| 234 | Y = 0x0059, |
| 235 | Z = 0x005A, |
| 236 | BRACKETLEFT = 0x005B, |
| 237 | BACKSLASH = 0x005C, |
| 238 | BRACKETRIGHT = 0x005D, |
| 239 | ASCIICIRCUM = 0x005E, |
| 240 | UNDERSCORE = 0x005F, |
| 241 | QUOTELEFT = 0x0060, |
| 242 | BRACELEFT = 0x007B, |
| 243 | BAR = 0x007C, |
| 244 | BRACERIGHT = 0x007D, |
| 245 | ASCIITILDE = 0x007E, |
| 246 | YEN = 0x00A5, |
| 247 | SECTION = 0x00A7, |
| 248 | }; |
| 249 | |
| 250 | enum class KeyModifierMask { |
| 251 | CODE_MASK = ((1 << 23) - 1), ///< Apply this mask to any keycode to remove modifiers. |
| 252 | MODIFIER_MASK = (0x7F << 22), ///< Apply this mask to isolate modifiers. |
| 253 | //RESERVED = (1 << 23), |
| 254 | CMD_OR_CTRL = (1 << 24), |
| 255 | SHIFT = (1 << 25), |
| 256 | ALT = (1 << 26), |
| 257 | META = (1 << 27), |
| 258 | CTRL = (1 << 28), |
| 259 | KPAD = (1 << 29), |
| 260 | GROUP_SWITCH = (1 << 30) |
| 261 | }; |
| 262 | |
| 263 | // To avoid having unnecessary operators, only define the ones that are needed. |
| 264 | |
| 265 | constexpr Key operator-(uint32_t a, Key b) { |
| 266 | return (Key)(a - (uint32_t)b); |
| 267 | } |
| 268 | |
| 269 | constexpr Key &operator-=(Key &a, int b) { |
| 270 | a = static_cast<Key>(static_cast<int>(a) - static_cast<int>(b)); |
| 271 | return a; |
| 272 | } |
| 273 | |
| 274 | constexpr Key operator+(Key a, int b) { |
| 275 | return (Key)((int)a + (int)b); |
| 276 | } |
| 277 | |
| 278 | constexpr Key operator+(Key a, Key b) { |
| 279 | return (Key)((int)a + (int)b); |
| 280 | } |
| 281 | |
| 282 | constexpr Key operator-(Key a, Key b) { |
| 283 | return (Key)((int)a - (int)b); |
| 284 | } |
| 285 | |
| 286 | constexpr Key operator&(Key a, Key b) { |
| 287 | return (Key)((int)a & (int)b); |
| 288 | } |
| 289 | |
| 290 | constexpr Key operator|(Key a, Key b) { |
| 291 | return (Key)((int)a | (int)b); |
| 292 | } |
| 293 | |
| 294 | constexpr Key &operator|=(Key &a, Key b) { |
| 295 | a = static_cast<Key>(static_cast<int>(a) | static_cast<int>(b)); |
| 296 | return a; |
| 297 | } |
| 298 | |
| 299 | constexpr Key &operator|=(Key &a, KeyModifierMask b) { |
| 300 | a = static_cast<Key>(static_cast<int>(a) | static_cast<int>(b)); |
| 301 | return a; |
| 302 | } |
| 303 | |
| 304 | constexpr Key &operator&=(Key &a, KeyModifierMask b) { |
| 305 | a = static_cast<Key>(static_cast<int>(a) & static_cast<int>(b)); |
| 306 | return a; |
| 307 | } |
| 308 | |
| 309 | constexpr Key operator|(Key a, KeyModifierMask b) { |
| 310 | return (Key)((int)a | (int)b); |
| 311 | } |
| 312 | |
| 313 | constexpr Key operator&(Key a, KeyModifierMask b) { |
| 314 | return (Key)((int)a & (int)b); |
| 315 | } |
| 316 | |
| 317 | constexpr Key operator+(KeyModifierMask a, Key b) { |
| 318 | return (Key)((int)a + (int)b); |
| 319 | } |
| 320 | |
| 321 | constexpr Key operator|(KeyModifierMask a, Key b) { |
| 322 | return (Key)((int)a | (int)b); |
| 323 | } |
| 324 | |
| 325 | constexpr KeyModifierMask operator+(KeyModifierMask a, KeyModifierMask b) { |
| 326 | return (KeyModifierMask)((int)a + (int)b); |
| 327 | } |
| 328 | |
| 329 | constexpr KeyModifierMask operator|(KeyModifierMask a, KeyModifierMask b) { |
| 330 | return (KeyModifierMask)((int)a | (int)b); |
| 331 | } |
| 332 | |
| 333 | String keycode_get_string(Key p_code); |
| 334 | bool keycode_has_unicode(Key p_keycode); |
| 335 | Key find_keycode(const String &p_codestr); |
| 336 | const char *find_keycode_name(Key p_keycode); |
| 337 | int keycode_get_count(); |
| 338 | int keycode_get_value_by_index(int p_index); |
| 339 | const char *keycode_get_name_by_index(int p_index); |
| 340 | |
| 341 | char32_t fix_unicode(char32_t p_char); |
| 342 | Key fix_keycode(char32_t p_char, Key p_key); |
| 343 | Key fix_key_label(char32_t p_char, Key p_key); |
| 344 | |
| 345 | #endif // KEYBOARD_H |
| 346 | |