]> git.xonotic.org Git - xonotic/darkplaces.git/blob - keys.h
physics: fix and refactor unsticking
[xonotic/darkplaces.git] / keys.h
1 /*
2         $RCSfile$
3
4         Copyright (C) 1996-1997  Id Software, Inc.
5
6         This program is free software; you can redistribute it and/or
7         modify it under the terms of the GNU General Public License
8         as published by the Free Software Foundation; either version 2
9         of the License, or (at your option) any later version.
10
11         This program is distributed in the hope that it will be useful,
12         but WITHOUT ANY WARRANTY; without even the implied warranty of
13         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
15         See the GNU General Public License for more details.
16
17         You should have received a copy of the GNU General Public License
18         along with this program; if not, write to:
19
20                 Free Software Foundation, Inc.
21                 59 Temple Place - Suite 330
22                 Boston, MA  02111-1307, USA
23
24         $Id$
25 */
26
27 #ifndef __KEYS_H
28 #define __KEYS_H
29
30 #include <stddef.h>
31 #include "qtypes.h"
32 #include "qdefs.h"
33 #include "fs.h"
34 #include "cmd.h"
35
36 // the highest Unicode character to allow key binding.
37 // note that an excessively high value may degrade fps
38 // when code is looping through the bindings
39 // U+ABFF is probably the highest bindable codepoint,
40 // see: https://github.com/DarkPlacesEngine/darkplaces/pull/68#issuecomment-1416802873
41 #define MAX_KEY_BINDS 0xAC00
42
43 // how long is a "tinystr" to hold a keyboard key's
44 // Unicode utf-8 presentation, plus final \x00
45 // to allow all characters <= 0xffff, use 4
46 #define TINYSTR_LEN 4
47
48 //
49 // these are the key numbers that should be passed to Key_Event
50 //
51 typedef enum keynum_e
52 {
53         K_TEXT                  = 1, // used only for unicode character input
54         K_TAB                   = 9,
55         K_ENTER                 = 13,
56         K_ESCAPE                = 27,
57         K_SPACE                 = 32,
58
59         // normal keys should be passed as lowercased ascii
60
61         K_BACKSPACE             = 127,
62         K_UPARROW,
63         K_DOWNARROW,
64         K_LEFTARROW,
65         K_RIGHTARROW,
66
67         K_ALT,
68         K_CTRL,
69         K_SHIFT,
70
71         K_F1,
72         K_F2,
73         K_F3,
74         K_F4,
75         K_F5,
76         K_F6,
77         K_F7,
78         K_F8,
79         K_F9,
80         K_F10,
81         K_F11,
82         K_F12,
83
84         K_INS,
85         K_DEL,
86         K_PGDN,
87         K_PGUP,
88         K_HOME,
89         K_END,
90
91         K_PAUSE,
92
93         K_NUMLOCK,
94         K_CAPSLOCK,
95         K_SCROLLOCK,
96
97         K_KP_0,
98         K_KP_INS = K_KP_0,
99         K_KP_1,
100         K_KP_END = K_KP_1,
101         K_KP_2,
102         K_KP_DOWNARROW = K_KP_2,
103         K_KP_3,
104         K_KP_PGDN = K_KP_3,
105         K_KP_4,
106         K_KP_LEFTARROW = K_KP_4,
107         K_KP_5,
108         K_KP_6,
109         K_KP_RIGHTARROW = K_KP_6,
110         K_KP_7,
111         K_KP_HOME = K_KP_7,
112         K_KP_8,
113         K_KP_UPARROW = K_KP_8,
114         K_KP_9,
115         K_KP_PGUP = K_KP_9,
116         K_KP_PERIOD,
117         K_KP_DEL = K_KP_PERIOD,
118         K_KP_DIVIDE,
119         K_KP_SLASH = K_KP_DIVIDE,
120         K_KP_MULTIPLY,
121         K_KP_MINUS,
122         K_KP_PLUS,
123         K_KP_ENTER,
124         K_KP_EQUALS,
125
126         K_PRINTSCREEN,
127
128         // mouse buttons generate virtual keys
129
130         K_MOUSE1 = 512,
131         K_OTHERDEVICESBEGIN = K_MOUSE1,
132         K_MOUSE2,
133         K_MOUSE3,
134         K_MWHEELUP,
135         K_MWHEELDOWN,
136         K_MOUSE4,
137         K_MOUSE5,
138         K_MOUSE6,
139         K_MOUSE7,
140         K_MOUSE8,
141         K_MOUSE9,
142         K_MOUSE10,
143         K_MOUSE11,
144         K_MOUSE12,
145         K_MOUSE13,
146         K_MOUSE14,
147         K_MOUSE15,
148         K_MOUSE16,
149
150 //
151 // joystick buttons
152 //
153         K_JOY1 = 768,
154         K_JOY2,
155         K_JOY3,
156         K_JOY4,
157         K_JOY5,
158         K_JOY6,
159         K_JOY7,
160         K_JOY8,
161         K_JOY9,
162         K_JOY10,
163         K_JOY11,
164         K_JOY12,
165         K_JOY13,
166         K_JOY14,
167         K_JOY15,
168         K_JOY16,
169
170 //
171 // aux keys are for multi-buttoned joysticks to generate so they can use
172 // the normal binding process
173 //
174         K_AUX1,
175         K_AUX2,
176         K_AUX3,
177         K_AUX4,
178         K_AUX5,
179         K_AUX6,
180         K_AUX7,
181         K_AUX8,
182         K_AUX9,
183         K_AUX10,
184         K_AUX11,
185         K_AUX12,
186         K_AUX13,
187         K_AUX14,
188         K_AUX15,
189         K_AUX16,
190         K_AUX17,
191         K_AUX18,
192         K_AUX19,
193         K_AUX20,
194         K_AUX21,
195         K_AUX22,
196         K_AUX23,
197         K_AUX24,
198         K_AUX25,
199         K_AUX26,
200         K_AUX27,
201         K_AUX28,
202         K_AUX29,
203         K_AUX30,
204         K_AUX31,
205         K_AUX32,
206
207         // Microsoft Xbox 360 Controller For Windows
208         K_X360_DPAD_UP,
209         K_X360_DPAD_DOWN,
210         K_X360_DPAD_LEFT,
211         K_X360_DPAD_RIGHT,
212         K_X360_START,
213         K_X360_BACK,
214         K_X360_LEFT_THUMB,
215         K_X360_RIGHT_THUMB,
216         K_X360_LEFT_SHOULDER,
217         K_X360_RIGHT_SHOULDER,
218         K_X360_A,
219         K_X360_B,
220         K_X360_X,
221         K_X360_Y,
222         K_X360_LEFT_TRIGGER,
223         K_X360_RIGHT_TRIGGER,
224         K_X360_LEFT_THUMB_UP,
225         K_X360_LEFT_THUMB_DOWN,
226         K_X360_LEFT_THUMB_LEFT,
227         K_X360_LEFT_THUMB_RIGHT,
228         K_X360_RIGHT_THUMB_UP,
229         K_X360_RIGHT_THUMB_DOWN,
230         K_X360_RIGHT_THUMB_LEFT,
231         K_X360_RIGHT_THUMB_RIGHT,
232
233         // generic joystick emulation for menu
234         K_JOY_UP,
235         K_JOY_DOWN,
236         K_JOY_LEFT,
237         K_JOY_RIGHT,
238
239         K_MIDINOTE0 = 896, // to this, the note number is added
240         K_MIDINOTE1,
241         K_MIDINOTE2,
242         K_MIDINOTE3,
243         K_MIDINOTE4,
244         K_MIDINOTE5,
245         K_MIDINOTE6,
246         K_MIDINOTE7,
247         K_MIDINOTE8,
248         K_MIDINOTE9,
249         K_MIDINOTE10,
250         K_MIDINOTE11,
251         K_MIDINOTE12,
252         K_MIDINOTE13,
253         K_MIDINOTE14,
254         K_MIDINOTE15,
255         K_MIDINOTE16,
256         K_MIDINOTE17,
257         K_MIDINOTE18,
258         K_MIDINOTE19,
259         K_MIDINOTE20,
260         K_MIDINOTE21,
261         K_MIDINOTE22,
262         K_MIDINOTE23,
263         K_MIDINOTE24,
264         K_MIDINOTE25,
265         K_MIDINOTE26,
266         K_MIDINOTE27,
267         K_MIDINOTE28,
268         K_MIDINOTE29,
269         K_MIDINOTE30,
270         K_MIDINOTE31,
271         K_MIDINOTE32,
272         K_MIDINOTE33,
273         K_MIDINOTE34,
274         K_MIDINOTE35,
275         K_MIDINOTE36,
276         K_MIDINOTE37,
277         K_MIDINOTE38,
278         K_MIDINOTE39,
279         K_MIDINOTE40,
280         K_MIDINOTE41,
281         K_MIDINOTE42,
282         K_MIDINOTE43,
283         K_MIDINOTE44,
284         K_MIDINOTE45,
285         K_MIDINOTE46,
286         K_MIDINOTE47,
287         K_MIDINOTE48,
288         K_MIDINOTE49,
289         K_MIDINOTE50,
290         K_MIDINOTE51,
291         K_MIDINOTE52,
292         K_MIDINOTE53,
293         K_MIDINOTE54,
294         K_MIDINOTE55,
295         K_MIDINOTE56,
296         K_MIDINOTE57,
297         K_MIDINOTE58,
298         K_MIDINOTE59,
299         K_MIDINOTE60,
300         K_MIDINOTE61,
301         K_MIDINOTE62,
302         K_MIDINOTE63,
303         K_MIDINOTE64,
304         K_MIDINOTE65,
305         K_MIDINOTE66,
306         K_MIDINOTE67,
307         K_MIDINOTE68,
308         K_MIDINOTE69,
309         K_MIDINOTE70,
310         K_MIDINOTE71,
311         K_MIDINOTE72,
312         K_MIDINOTE73,
313         K_MIDINOTE74,
314         K_MIDINOTE75,
315         K_MIDINOTE76,
316         K_MIDINOTE77,
317         K_MIDINOTE78,
318         K_MIDINOTE79,
319         K_MIDINOTE80,
320         K_MIDINOTE81,
321         K_MIDINOTE82,
322         K_MIDINOTE83,
323         K_MIDINOTE84,
324         K_MIDINOTE85,
325         K_MIDINOTE86,
326         K_MIDINOTE87,
327         K_MIDINOTE88,
328         K_MIDINOTE89,
329         K_MIDINOTE90,
330         K_MIDINOTE91,
331         K_MIDINOTE92,
332         K_MIDINOTE93,
333         K_MIDINOTE94,
334         K_MIDINOTE95,
335         K_MIDINOTE96,
336         K_MIDINOTE97,
337         K_MIDINOTE98,
338         K_MIDINOTE99,
339         K_MIDINOTE100,
340         K_MIDINOTE101,
341         K_MIDINOTE102,
342         K_MIDINOTE103,
343         K_MIDINOTE104,
344         K_MIDINOTE105,
345         K_MIDINOTE106,
346         K_MIDINOTE107,
347         K_MIDINOTE108,
348         K_MIDINOTE109,
349         K_MIDINOTE110,
350         K_MIDINOTE111,
351         K_MIDINOTE112,
352         K_MIDINOTE113,
353         K_MIDINOTE114,
354         K_MIDINOTE115,
355         K_MIDINOTE116,
356         K_MIDINOTE117,
357         K_MIDINOTE118,
358         K_MIDINOTE119,
359         K_MIDINOTE120,
360         K_MIDINOTE121,
361         K_MIDINOTE122,
362         K_MIDINOTE123,
363         K_MIDINOTE124,
364         K_MIDINOTE125,
365         K_MIDINOTE126,
366         K_MIDINOTE127,
367
368         MAX_KEYS = MAX_KEY_BINDS
369 }
370 keynum_t;
371
372 typedef enum keydest_e { key_game, key_message, key_menu, key_menu_grabbed, key_console, key_void } keydest_t;
373
374 extern  char            key_line[MAX_INPUTLINE];
375 extern  int                     key_linepos;
376 extern  qbool   key_insert;     // insert key toggle (for editing)
377 extern  keydest_t       key_dest;
378 // key_consoleactive bits
379 // user wants console (halfscreen)
380 #define KEY_CONSOLEACTIVE_USER 1
381 // console forced because there's nothing else active (fullscreen)
382 #define KEY_CONSOLEACTIVE_FORCED 4
383 extern  int                     key_consoleactive;
384 extern  char            *keybindings[MAX_BINDMAPS][MAX_KEYS];
385
386 extern signed char chat_mode; // 0 for say, 1 for say_team, -1 for command
387 extern char chat_buffer[MAX_INPUTLINE];
388 extern int      chat_bufferpos;
389
390 int Key_ClearEditLine(qbool is_console);
391 void Key_WriteBindings(qfile_t *f);
392 void Key_Init(void);
393 void Key_Shutdown(void);
394 void Key_Init_Cvars(void);
395 void Key_Event(int key, int ascii, qbool down);
396 void Key_ReleaseAll (void);
397 void Key_ReleaseAll_f(cmd_state_t *cmd);
398 void Key_EventQueue_Block(void);
399 void Key_EventQueue_Unblock(void);
400 int Key_AddChar(int unicode, qbool is_console);
401 int Key_Parse_CommonKeys(cmd_state_t *cmd, qbool is_console, int key, int unicode);
402
403 qbool Key_SetBinding (int keynum, int bindmap, const char *binding);
404 const char *Key_GetBind (int key, int bindmap);
405 void Key_FindKeysForCommand (const char *command, int *keys, int numkeys, int bindmap);
406 qbool Key_SetBindMap(int fg, int bg);
407 void Key_GetBindMap(int *fg, int *bg);
408 const char *Key_KeynumToString (int keynum, char *buf, size_t buflength);
409 int Key_StringToKeynum (const char *str);
410
411 #endif // __KEYS_H
412