1 /*************************************************************************/ 2 /* keyboard.h */ 3 /*************************************************************************/ 4 /* This file is part of: */ 5 /* GODOT ENGINE */ 6 /* https://godotengine.org */ 7 /*************************************************************************/ 8 /* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */ 9 /* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */ 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 #ifndef KEYBOARD_H 31 #define KEYBOARD_H 32 33 #include "ustring.h" 34 /** 35 @author Juan Linietsky <reduzio@gmail.com> 36 */ 37 38 /** 39 @author Juan Linietsky <reduzio@gmail.com> 40 */ 41 42 /* 43 Special Key: 44 45 The strategy here is similar to the one used by toolkits, 46 which consists in leaving the 24 bits unicode range for printable 47 characters, and use the upper 8 bits for special keys and 48 modifiers. This way everything (char/keycode) can fit nicely in one 32 bits unsigned integer. 49 */ 50 enum { 51 SPKEY = (1 << 24) 52 }; 53 54 enum KeyList { 55 /* CURSOR/FUNCTION/BROWSER/MULTIMEDIA/MISC KEYS */ 56 KEY_ESCAPE = SPKEY | 0x01, 57 KEY_TAB = SPKEY | 0x02, 58 KEY_BACKTAB = SPKEY | 0x03, 59 KEY_BACKSPACE = SPKEY | 0x04, 60 KEY_RETURN = SPKEY | 0x05, 61 KEY_ENTER = SPKEY | 0x06, 62 KEY_INSERT = SPKEY | 0x07, 63 KEY_DELETE = SPKEY | 0x08, 64 KEY_PAUSE = SPKEY | 0x09, 65 KEY_PRINT = SPKEY | 0x0A, 66 KEY_SYSREQ = SPKEY | 0x0B, 67 KEY_CLEAR = SPKEY | 0x0C, 68 KEY_HOME = SPKEY | 0x0D, 69 KEY_END = SPKEY | 0x0E, 70 KEY_LEFT = SPKEY | 0x0F, 71 KEY_UP = SPKEY | 0x10, 72 KEY_RIGHT = SPKEY | 0x11, 73 KEY_DOWN = SPKEY | 0x12, 74 KEY_PAGEUP = SPKEY | 0x13, 75 KEY_PAGEDOWN = SPKEY | 0x14, 76 KEY_SHIFT = SPKEY | 0x15, 77 KEY_CONTROL = SPKEY | 0x16, 78 KEY_META = SPKEY | 0x17, 79 KEY_ALT = SPKEY | 0x18, 80 KEY_CAPSLOCK = SPKEY | 0x19, 81 KEY_NUMLOCK = SPKEY | 0x1A, 82 KEY_SCROLLLOCK = SPKEY | 0x1B, 83 KEY_F1 = SPKEY | 0x1C, 84 KEY_F2 = SPKEY | 0x1D, 85 KEY_F3 = SPKEY | 0x1E, 86 KEY_F4 = SPKEY | 0x1F, 87 KEY_F5 = SPKEY | 0x20, 88 KEY_F6 = SPKEY | 0x21, 89 KEY_F7 = SPKEY | 0x22, 90 KEY_F8 = SPKEY | 0x23, 91 KEY_F9 = SPKEY | 0x24, 92 KEY_F10 = SPKEY | 0x25, 93 KEY_F11 = SPKEY | 0x26, 94 KEY_F12 = SPKEY | 0x27, 95 KEY_F13 = SPKEY | 0x28, 96 KEY_F14 = SPKEY | 0x29, 97 KEY_F15 = SPKEY | 0x2A, 98 KEY_F16 = SPKEY | 0x2B, 99 KEY_KP_ENTER = SPKEY | 0x80, 100 KEY_KP_MULTIPLY = SPKEY | 0x81, 101 KEY_KP_DIVIDE = SPKEY | 0x82, 102 KEY_KP_SUBTRACT = SPKEY | 0x83, 103 KEY_KP_PERIOD = SPKEY | 0x84, 104 KEY_KP_ADD = SPKEY | 0x85, 105 KEY_KP_0 = SPKEY | 0x86, 106 KEY_KP_1 = SPKEY | 0x87, 107 KEY_KP_2 = SPKEY | 0x88, 108 KEY_KP_3 = SPKEY | 0x89, 109 KEY_KP_4 = SPKEY | 0x8A, 110 KEY_KP_5 = SPKEY | 0x8B, 111 KEY_KP_6 = SPKEY | 0x8C, 112 KEY_KP_7 = SPKEY | 0x8D, 113 KEY_KP_8 = SPKEY | 0x8E, 114 KEY_KP_9 = SPKEY | 0x8F, 115 KEY_SUPER_L = SPKEY | 0x2C, 116 KEY_SUPER_R = SPKEY | 0x2D, 117 KEY_MENU = SPKEY | 0x2E, 118 KEY_HYPER_L = SPKEY | 0x2F, 119 KEY_HYPER_R = SPKEY | 0x30, 120 KEY_HELP = SPKEY | 0x31, 121 KEY_DIRECTION_L = SPKEY | 0x32, 122 KEY_DIRECTION_R = SPKEY | 0x33, 123 KEY_BACK = SPKEY | 0x40, 124 KEY_FORWARD = SPKEY | 0x41, 125 KEY_STOP = SPKEY | 0x42, 126 KEY_REFRESH = SPKEY | 0x43, 127 KEY_VOLUMEDOWN = SPKEY | 0x44, 128 KEY_VOLUMEMUTE = SPKEY | 0x45, 129 KEY_VOLUMEUP = SPKEY | 0x46, 130 KEY_BASSBOOST = SPKEY | 0x47, 131 KEY_BASSUP = SPKEY | 0x48, 132 KEY_BASSDOWN = SPKEY | 0x49, 133 KEY_TREBLEUP = SPKEY | 0x4A, 134 KEY_TREBLEDOWN = SPKEY | 0x4B, 135 KEY_MEDIAPLAY = SPKEY | 0x4C, 136 KEY_MEDIASTOP = SPKEY | 0x4D, 137 KEY_MEDIAPREVIOUS = SPKEY | 0x4E, 138 KEY_MEDIANEXT = SPKEY | 0x4F, 139 KEY_MEDIARECORD = SPKEY | 0x50, 140 KEY_HOMEPAGE = SPKEY | 0x51, 141 KEY_FAVORITES = SPKEY | 0x52, 142 KEY_SEARCH = SPKEY | 0x53, 143 KEY_STANDBY = SPKEY | 0x54, 144 KEY_OPENURL = SPKEY | 0x55, 145 KEY_LAUNCHMAIL = SPKEY | 0x56, 146 KEY_LAUNCHMEDIA = SPKEY | 0x57, 147 KEY_LAUNCH0 = SPKEY | 0x58, 148 KEY_LAUNCH1 = SPKEY | 0x59, 149 KEY_LAUNCH2 = SPKEY | 0x5A, 150 KEY_LAUNCH3 = SPKEY | 0x5B, 151 KEY_LAUNCH4 = SPKEY | 0x5C, 152 KEY_LAUNCH5 = SPKEY | 0x5D, 153 KEY_LAUNCH6 = SPKEY | 0x5E, 154 KEY_LAUNCH7 = SPKEY | 0x5F, 155 KEY_LAUNCH8 = SPKEY | 0x60, 156 KEY_LAUNCH9 = SPKEY | 0x61, 157 KEY_LAUNCHA = SPKEY | 0x62, 158 KEY_LAUNCHB = SPKEY | 0x63, 159 KEY_LAUNCHC = SPKEY | 0x64, 160 KEY_LAUNCHD = SPKEY | 0x65, 161 KEY_LAUNCHE = SPKEY | 0x66, 162 KEY_LAUNCHF = SPKEY | 0x67, 163 164 KEY_UNKNOWN = SPKEY | 0xFFFFFF, 165 166 /* PRINTABLE LATIN 1 CODES */ 167 168 KEY_SPACE = 0x0020, 169 KEY_EXCLAM = 0x0021, 170 KEY_QUOTEDBL = 0x0022, 171 KEY_NUMBERSIGN = 0x0023, 172 KEY_DOLLAR = 0x0024, 173 KEY_PERCENT = 0x0025, 174 KEY_AMPERSAND = 0x0026, 175 KEY_APOSTROPHE = 0x0027, 176 KEY_PARENLEFT = 0x0028, 177 KEY_PARENRIGHT = 0x0029, 178 KEY_ASTERISK = 0x002A, 179 KEY_PLUS = 0x002B, 180 KEY_COMMA = 0x002C, 181 KEY_MINUS = 0x002D, 182 KEY_PERIOD = 0x002E, 183 KEY_SLASH = 0x002F, 184 KEY_0 = 0x0030, 185 KEY_1 = 0x0031, 186 KEY_2 = 0x0032, 187 KEY_3 = 0x0033, 188 KEY_4 = 0x0034, 189 KEY_5 = 0x0035, 190 KEY_6 = 0x0036, 191 KEY_7 = 0x0037, 192 KEY_8 = 0x0038, 193 KEY_9 = 0x0039, 194 KEY_COLON = 0x003A, 195 KEY_SEMICOLON = 0x003B, 196 KEY_LESS = 0x003C, 197 KEY_EQUAL = 0x003D, 198 KEY_GREATER = 0x003E, 199 KEY_QUESTION = 0x003F, 200 KEY_AT = 0x0040, 201 KEY_A = 0x0041, 202 KEY_B = 0x0042, 203 KEY_C = 0x0043, 204 KEY_D = 0x0044, 205 KEY_E = 0x0045, 206 KEY_F = 0x0046, 207 KEY_G = 0x0047, 208 KEY_H = 0x0048, 209 KEY_I = 0x0049, 210 KEY_J = 0x004A, 211 KEY_K = 0x004B, 212 KEY_L = 0x004C, 213 KEY_M = 0x004D, 214 KEY_N = 0x004E, 215 KEY_O = 0x004F, 216 KEY_P = 0x0050, 217 KEY_Q = 0x0051, 218 KEY_R = 0x0052, 219 KEY_S = 0x0053, 220 KEY_T = 0x0054, 221 KEY_U = 0x0055, 222 KEY_V = 0x0056, 223 KEY_W = 0x0057, 224 KEY_X = 0x0058, 225 KEY_Y = 0x0059, 226 KEY_Z = 0x005A, 227 KEY_BRACKETLEFT = 0x005B, 228 KEY_BACKSLASH = 0x005C, 229 KEY_BRACKETRIGHT = 0x005D, 230 KEY_ASCIICIRCUM = 0x005E, 231 KEY_UNDERSCORE = 0x005F, 232 KEY_QUOTELEFT = 0x0060, 233 KEY_BRACELEFT = 0x007B, 234 KEY_BAR = 0x007C, 235 KEY_BRACERIGHT = 0x007D, 236 KEY_ASCIITILDE = 0x007E, 237 KEY_NOBREAKSPACE = 0x00A0, 238 KEY_EXCLAMDOWN = 0x00A1, 239 KEY_CENT = 0x00A2, 240 KEY_STERLING = 0x00A3, 241 KEY_CURRENCY = 0x00A4, 242 KEY_YEN = 0x00A5, 243 KEY_BROKENBAR = 0x00A6, 244 KEY_SECTION = 0x00A7, 245 KEY_DIAERESIS = 0x00A8, 246 KEY_COPYRIGHT = 0x00A9, 247 KEY_ORDFEMININE = 0x00AA, 248 KEY_GUILLEMOTLEFT = 0x00AB, 249 KEY_NOTSIGN = 0x00AC, 250 KEY_HYPHEN = 0x00AD, 251 KEY_REGISTERED = 0x00AE, 252 KEY_MACRON = 0x00AF, 253 KEY_DEGREE = 0x00B0, 254 KEY_PLUSMINUS = 0x00B1, 255 KEY_TWOSUPERIOR = 0x00B2, 256 KEY_THREESUPERIOR = 0x00B3, 257 KEY_ACUTE = 0x00B4, 258 KEY_MU = 0x00B5, 259 KEY_PARAGRAPH = 0x00B6, 260 KEY_PERIODCENTERED = 0x00B7, 261 KEY_CEDILLA = 0x00B8, 262 KEY_ONESUPERIOR = 0x00B9, 263 KEY_MASCULINE = 0x00BA, 264 KEY_GUILLEMOTRIGHT = 0x00BB, 265 KEY_ONEQUARTER = 0x00BC, 266 KEY_ONEHALF = 0x00BD, 267 KEY_THREEQUARTERS = 0x00BE, 268 KEY_QUESTIONDOWN = 0x00BF, 269 KEY_AGRAVE = 0x00C0, 270 KEY_AACUTE = 0x00C1, 271 KEY_ACIRCUMFLEX = 0x00C2, 272 KEY_ATILDE = 0x00C3, 273 KEY_ADIAERESIS = 0x00C4, 274 KEY_ARING = 0x00C5, 275 KEY_AE = 0x00C6, 276 KEY_CCEDILLA = 0x00C7, 277 KEY_EGRAVE = 0x00C8, 278 KEY_EACUTE = 0x00C9, 279 KEY_ECIRCUMFLEX = 0x00CA, 280 KEY_EDIAERESIS = 0x00CB, 281 KEY_IGRAVE = 0x00CC, 282 KEY_IACUTE = 0x00CD, 283 KEY_ICIRCUMFLEX = 0x00CE, 284 KEY_IDIAERESIS = 0x00CF, 285 KEY_ETH = 0x00D0, 286 KEY_NTILDE = 0x00D1, 287 KEY_OGRAVE = 0x00D2, 288 KEY_OACUTE = 0x00D3, 289 KEY_OCIRCUMFLEX = 0x00D4, 290 KEY_OTILDE = 0x00D5, 291 KEY_ODIAERESIS = 0x00D6, 292 KEY_MULTIPLY = 0x00D7, 293 KEY_OOBLIQUE = 0x00D8, 294 KEY_UGRAVE = 0x00D9, 295 KEY_UACUTE = 0x00DA, 296 KEY_UCIRCUMFLEX = 0x00DB, 297 KEY_UDIAERESIS = 0x00DC, 298 KEY_YACUTE = 0x00DD, 299 KEY_THORN = 0x00DE, 300 KEY_SSHARP = 0x00DF, 301 302 KEY_DIVISION = 0x00F7, 303 KEY_YDIAERESIS = 0x00FF, 304 305 }; 306 307 enum KeyModifierMask { 308 309 KEY_CODE_MASK = ((1 << 25) - 1), ///< Apply this mask to any keycode to remove modifiers. 310 KEY_MODIFIER_MASK = (0xFF << 24), ///< Apply this mask to isolate modifiers. 311 KEY_MASK_SHIFT = (1 << 25), 312 KEY_MASK_ALT = (1 << 26), 313 KEY_MASK_META = (1 << 27), 314 KEY_MASK_CTRL = (1 << 28), 315 #ifdef APPLE_STYLE_KEYS 316 KEY_MASK_CMD = KEY_MASK_META, 317 #else 318 KEY_MASK_CMD = KEY_MASK_CTRL, 319 #endif 320 321 KEY_MASK_KPAD = (1 << 29), 322 KEY_MASK_GROUP_SWITCH = (1 << 30) 323 // bit 31 can't be used because variant uses regular 32 bits int as datatype 324 325 }; 326 327 String keycode_get_string(uint32_t p_code); 328 bool keycode_has_unicode(uint32_t p_unicode); 329 int find_keycode(const String &p_code); 330 int latin_keyboard_keycode_convert(int p_keycode); 331 332 #endif 333