#ifndef __KEYS_H
#define __KEYS_H
+#include <stddef.h>
#include "qtypes.h"
+#include "qdefs.h"
+#include "fs.h"
+#include "cmd.h"
+
+// the highest Unicode character to allow key binding.
+// note that an excessively high value may degrade fps
+// when code is looping through the bindings
+// U+ABFF is probably the highest bindable codepoint,
+// see: https://github.com/DarkPlacesEngine/darkplaces/pull/68#issuecomment-1416802873
+#define MAX_KEY_BINDS 0xAC00
+
+// how long is a "tinystr" to hold a keyboard key's
+// Unicode utf-8 presentation, plus final \x00
+// to allow all characters <= 0xffff, use 4
+#define TINYSTR_LEN 4
//
// these are the key numbers that should be passed to Key_Event
K_MIDINOTE126,
K_MIDINOTE127,
- MAX_KEYS
+ MAX_KEYS = MAX_KEY_BINDS
}
keynum_t;
extern char key_line[MAX_INPUTLINE];
extern int key_linepos;
-extern qboolean key_insert; // insert key toggle (for editing)
+extern qbool key_insert; // insert key toggle (for editing)
extern keydest_t key_dest;
// key_consoleactive bits
// user wants console (halfscreen)
extern int key_consoleactive;
extern char *keybindings[MAX_BINDMAPS][MAX_KEYS];
-extern int chat_mode; // 0 for say, 1 for say_team, -1 for command
+extern signed char chat_mode; // 0 for say, 1 for say_team, -1 for command
extern char chat_buffer[MAX_INPUTLINE];
-extern unsigned int chat_bufferlen;
+extern int chat_bufferpos;
-void Key_ClearEditLine(int edit_line);
+int Key_ClearEditLine(qbool is_console);
void Key_WriteBindings(qfile_t *f);
void Key_Init(void);
void Key_Shutdown(void);
void Key_Init_Cvars(void);
-void Key_Event(int key, int ascii, qboolean down);
+void Key_Event(int key, int ascii, qbool down);
void Key_ReleaseAll (void);
-void Key_ClearStates (void); // FIXME: should this function still exist? Or should Key_ReleaseAll be used instead when shutting down a vid driver?
+void Key_ReleaseAll_f(cmd_state_t *cmd);
void Key_EventQueue_Block(void);
void Key_EventQueue_Unblock(void);
+int Key_AddChar(int unicode, qbool is_console);
+int Key_Parse_CommonKeys(cmd_state_t *cmd, qbool is_console, int key, int unicode);
-qboolean Key_SetBinding (int keynum, int bindmap, const char *binding);
+qbool Key_SetBinding (int keynum, int bindmap, const char *binding);
const char *Key_GetBind (int key, int bindmap);
void Key_FindKeysForCommand (const char *command, int *keys, int numkeys, int bindmap);
-qboolean Key_SetBindMap(int fg, int bg);
+qbool Key_SetBindMap(int fg, int bg);
void Key_GetBindMap(int *fg, int *bg);
+const char *Key_KeynumToString (int keynum, char *buf, size_t buflength);
+int Key_StringToKeynum (const char *str);
#endif // __KEYS_H