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