]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - keys.c
try to cache fewer animations for entities when r_shadows is used by using cull box
[xonotic/darkplaces.git] / keys.c
diff --git a/keys.c b/keys.c
index 879944f9ef9ba004ad4bd4626c54f68259626e50..eb57276cfb31ce49f0bde004d31d1ba12a929a25 100644 (file)
--- a/keys.c
+++ b/keys.c
@@ -22,6 +22,7 @@
 
 #include "quakedef.h"
 #include "cl_video.h"
+#include "utf8lib.h"
 
 cvar_t con_closeontoggleconsole = {CVAR_SAVE, "con_closeontoggleconsole","1", "allows toggleconsole binds to close the console as well"};
 
@@ -38,8 +39,6 @@ char          *keybindings[MAX_BINDMAPS][MAX_KEYS];
 int         history_line;
 char           history_savedline[MAX_INPUTLINE];
 conbuffer_t history;
-#define HIST_TEXTSIZE 262144
-#define HIST_MAXLINES 4096
 
 extern cvar_t  con_textsize;
 
@@ -234,6 +233,8 @@ static const keyname_t   keynames[] = {
        {"KP_ENTER", K_KP_ENTER},
        {"KP_EQUALS", K_KP_EQUALS},
 
+       {"PRINTSCREEN", K_PRINTSCREEN},
+
 
 
        {"MOUSE1", K_MOUSE1},
@@ -321,6 +322,135 @@ static const keyname_t   keynames[] = {
        {"APOSTROPHE", '\''},
        {"BACKSLASH", '\\'},            // because a raw backslash is used for special characters
 
+       {"MIDINOTE0", K_MIDINOTE0},
+       {"MIDINOTE1", K_MIDINOTE1},
+       {"MIDINOTE2", K_MIDINOTE2},
+       {"MIDINOTE3", K_MIDINOTE3},
+       {"MIDINOTE4", K_MIDINOTE4},
+       {"MIDINOTE5", K_MIDINOTE5},
+       {"MIDINOTE6", K_MIDINOTE6},
+       {"MIDINOTE7", K_MIDINOTE7},
+       {"MIDINOTE8", K_MIDINOTE8},
+       {"MIDINOTE9", K_MIDINOTE9},
+       {"MIDINOTE10", K_MIDINOTE10},
+       {"MIDINOTE11", K_MIDINOTE11},
+       {"MIDINOTE12", K_MIDINOTE12},
+       {"MIDINOTE13", K_MIDINOTE13},
+       {"MIDINOTE14", K_MIDINOTE14},
+       {"MIDINOTE15", K_MIDINOTE15},
+       {"MIDINOTE16", K_MIDINOTE16},
+       {"MIDINOTE17", K_MIDINOTE17},
+       {"MIDINOTE18", K_MIDINOTE18},
+       {"MIDINOTE19", K_MIDINOTE19},
+       {"MIDINOTE20", K_MIDINOTE20},
+       {"MIDINOTE21", K_MIDINOTE21},
+       {"MIDINOTE22", K_MIDINOTE22},
+       {"MIDINOTE23", K_MIDINOTE23},
+       {"MIDINOTE24", K_MIDINOTE24},
+       {"MIDINOTE25", K_MIDINOTE25},
+       {"MIDINOTE26", K_MIDINOTE26},
+       {"MIDINOTE27", K_MIDINOTE27},
+       {"MIDINOTE28", K_MIDINOTE28},
+       {"MIDINOTE29", K_MIDINOTE29},
+       {"MIDINOTE30", K_MIDINOTE30},
+       {"MIDINOTE31", K_MIDINOTE31},
+       {"MIDINOTE32", K_MIDINOTE32},
+       {"MIDINOTE33", K_MIDINOTE33},
+       {"MIDINOTE34", K_MIDINOTE34},
+       {"MIDINOTE35", K_MIDINOTE35},
+       {"MIDINOTE36", K_MIDINOTE36},
+       {"MIDINOTE37", K_MIDINOTE37},
+       {"MIDINOTE38", K_MIDINOTE38},
+       {"MIDINOTE39", K_MIDINOTE39},
+       {"MIDINOTE40", K_MIDINOTE40},
+       {"MIDINOTE41", K_MIDINOTE41},
+       {"MIDINOTE42", K_MIDINOTE42},
+       {"MIDINOTE43", K_MIDINOTE43},
+       {"MIDINOTE44", K_MIDINOTE44},
+       {"MIDINOTE45", K_MIDINOTE45},
+       {"MIDINOTE46", K_MIDINOTE46},
+       {"MIDINOTE47", K_MIDINOTE47},
+       {"MIDINOTE48", K_MIDINOTE48},
+       {"MIDINOTE49", K_MIDINOTE49},
+       {"MIDINOTE50", K_MIDINOTE50},
+       {"MIDINOTE51", K_MIDINOTE51},
+       {"MIDINOTE52", K_MIDINOTE52},
+       {"MIDINOTE53", K_MIDINOTE53},
+       {"MIDINOTE54", K_MIDINOTE54},
+       {"MIDINOTE55", K_MIDINOTE55},
+       {"MIDINOTE56", K_MIDINOTE56},
+       {"MIDINOTE57", K_MIDINOTE57},
+       {"MIDINOTE58", K_MIDINOTE58},
+       {"MIDINOTE59", K_MIDINOTE59},
+       {"MIDINOTE60", K_MIDINOTE60},
+       {"MIDINOTE61", K_MIDINOTE61},
+       {"MIDINOTE62", K_MIDINOTE62},
+       {"MIDINOTE63", K_MIDINOTE63},
+       {"MIDINOTE64", K_MIDINOTE64},
+       {"MIDINOTE65", K_MIDINOTE65},
+       {"MIDINOTE66", K_MIDINOTE66},
+       {"MIDINOTE67", K_MIDINOTE67},
+       {"MIDINOTE68", K_MIDINOTE68},
+       {"MIDINOTE69", K_MIDINOTE69},
+       {"MIDINOTE70", K_MIDINOTE70},
+       {"MIDINOTE71", K_MIDINOTE71},
+       {"MIDINOTE72", K_MIDINOTE72},
+       {"MIDINOTE73", K_MIDINOTE73},
+       {"MIDINOTE74", K_MIDINOTE74},
+       {"MIDINOTE75", K_MIDINOTE75},
+       {"MIDINOTE76", K_MIDINOTE76},
+       {"MIDINOTE77", K_MIDINOTE77},
+       {"MIDINOTE78", K_MIDINOTE78},
+       {"MIDINOTE79", K_MIDINOTE79},
+       {"MIDINOTE80", K_MIDINOTE80},
+       {"MIDINOTE81", K_MIDINOTE81},
+       {"MIDINOTE82", K_MIDINOTE82},
+       {"MIDINOTE83", K_MIDINOTE83},
+       {"MIDINOTE84", K_MIDINOTE84},
+       {"MIDINOTE85", K_MIDINOTE85},
+       {"MIDINOTE86", K_MIDINOTE86},
+       {"MIDINOTE87", K_MIDINOTE87},
+       {"MIDINOTE88", K_MIDINOTE88},
+       {"MIDINOTE89", K_MIDINOTE89},
+       {"MIDINOTE90", K_MIDINOTE90},
+       {"MIDINOTE91", K_MIDINOTE91},
+       {"MIDINOTE92", K_MIDINOTE92},
+       {"MIDINOTE93", K_MIDINOTE93},
+       {"MIDINOTE94", K_MIDINOTE94},
+       {"MIDINOTE95", K_MIDINOTE95},
+       {"MIDINOTE96", K_MIDINOTE96},
+       {"MIDINOTE97", K_MIDINOTE97},
+       {"MIDINOTE98", K_MIDINOTE98},
+       {"MIDINOTE99", K_MIDINOTE99},
+       {"MIDINOTE100", K_MIDINOTE100},
+       {"MIDINOTE101", K_MIDINOTE101},
+       {"MIDINOTE102", K_MIDINOTE102},
+       {"MIDINOTE103", K_MIDINOTE103},
+       {"MIDINOTE104", K_MIDINOTE104},
+       {"MIDINOTE105", K_MIDINOTE105},
+       {"MIDINOTE106", K_MIDINOTE106},
+       {"MIDINOTE107", K_MIDINOTE107},
+       {"MIDINOTE108", K_MIDINOTE108},
+       {"MIDINOTE109", K_MIDINOTE109},
+       {"MIDINOTE110", K_MIDINOTE110},
+       {"MIDINOTE111", K_MIDINOTE111},
+       {"MIDINOTE112", K_MIDINOTE112},
+       {"MIDINOTE113", K_MIDINOTE113},
+       {"MIDINOTE114", K_MIDINOTE114},
+       {"MIDINOTE115", K_MIDINOTE115},
+       {"MIDINOTE116", K_MIDINOTE116},
+       {"MIDINOTE117", K_MIDINOTE117},
+       {"MIDINOTE118", K_MIDINOTE118},
+       {"MIDINOTE119", K_MIDINOTE119},
+       {"MIDINOTE120", K_MIDINOTE120},
+       {"MIDINOTE121", K_MIDINOTE121},
+       {"MIDINOTE122", K_MIDINOTE122},
+       {"MIDINOTE123", K_MIDINOTE123},
+       {"MIDINOTE124", K_MIDINOTE124},
+       {"MIDINOTE125", K_MIDINOTE125},
+       {"MIDINOTE126", K_MIDINOTE126},
+       {"MIDINOTE127", K_MIDINOTE127},
+
        {NULL, 0}
 };
 
@@ -346,7 +476,7 @@ Interactive line editing and console scrollback
 ====================
 */
 static void
-Key_Console (int key, int ascii)
+Key_Console (int key, int unicode)
 {
        // LordHavoc: copied most of this from Q2 to improve keyboard handling
        switch (key)
@@ -423,6 +553,7 @@ Key_Console (int key, int ascii)
                        if (i > 0)
                        {
                                // terencehill: insert the clipboard text between the characters of the line
+                               /*
                                char *temp = (char *) Z_Malloc(MAX_INPUTLINE);
                                cbd[i]=0;
                                temp[0]=0;
@@ -434,6 +565,12 @@ Key_Console (int key, int ascii)
                                        strlcat(key_line, temp, sizeof(key_line));
                                Z_Free(temp);
                                key_linepos += i;
+                               */
+                               // blub: I'm changing this to use memmove() like the rest of the code does.
+                               cbd[i] = 0;
+                               memmove(key_line + key_linepos + i, key_line + key_linepos, sizeof(key_line) - key_linepos - i);
+                               memcpy(key_line + key_linepos, cbd, i);
+                               key_linepos += i;
                        }
                        Z_Free(cbd);
                }
@@ -575,7 +712,8 @@ Key_Console (int key, int ascii)
                else if(keydown[K_SHIFT]) // move cursor to the previous character ignoring colors
                {
                        int             pos;
-                       pos = key_linepos-1;
+                       size_t          inchar = 0;
+                       pos = u8_prevbyte(key_line, key_linepos);
                        while (pos)
                                if(pos-1 > 0 && key_line[pos-1] == STRING_COLOR_TAG && isdigit(key_line[pos]))
                                        pos-=2;
@@ -589,10 +727,14 @@ Key_Console (int key, int ascii)
                                        pos--;
                                        break;
                                }
-                       key_linepos = pos + 1;
+                       // we need to move to the beginning of the character when in a wide character:
+                       u8_charidx(key_line, pos + 1, &inchar);
+                       key_linepos = pos + 1 - inchar;
                }
                else
-                       key_linepos--;
+               {
+                       key_linepos = u8_prevbyte(key_line, key_linepos);
+               }
                return;
        }
 
@@ -601,8 +743,9 @@ Key_Console (int key, int ascii)
        {
                if (key_linepos > 1)
                {
-                       strlcpy(key_line + key_linepos - 1, key_line + key_linepos, sizeof(key_line) + 1 - key_linepos);
-                       key_linepos--;
+                       int newpos = u8_prevbyte(key_line, key_linepos);
+                       strlcpy(key_line + newpos, key_line + key_linepos, sizeof(key_line) + 1 - key_linepos);
+                       key_linepos = newpos;
                }
                return;
        }
@@ -613,7 +756,7 @@ Key_Console (int key, int ascii)
                size_t linelen;
                linelen = strlen(key_line);
                if (key_linepos < (int)linelen)
-                       memmove(key_line + key_linepos, key_line + key_linepos + 1, linelen - key_linepos);
+                       memmove(key_line + key_linepos, key_line + key_linepos + u8_bytelen(key_line + key_linepos, 1), linelen - key_linepos);
                return;
        }
 
@@ -667,7 +810,7 @@ Key_Console (int key, int ascii)
                        // skip the char
                        if (key_line[pos] == STRING_COLOR_TAG && key_line[pos+1] == STRING_COLOR_TAG) // consider ^^ as a character
                                pos++;
-                       pos++;
+                       pos += u8_bytelen(key_line + pos, 1);
                        
                        // now go beyond all next consecutive color tags, if any
                        if(pos < len)
@@ -683,7 +826,7 @@ Key_Console (int key, int ascii)
                        key_linepos = pos;
                }
                else
-                       key_linepos++;
+                       key_linepos += u8_bytelen(key_line + key_linepos, 1);
                return;
        }
 
@@ -778,7 +921,7 @@ Key_Console (int key, int ascii)
        if (key == K_HOME || key == K_KP_HOME)
        {
                if (keydown[K_CTRL])
-                       con_backscroll = INT_MAX;
+                       con_backscroll = CON_TEXTSIZE;
                else
                        key_linepos = 1;
                return;
@@ -794,22 +937,31 @@ Key_Console (int key, int ascii)
        }
 
        // non printable
-       if (ascii < 32)
+       if (unicode < 32)
                return;
 
        if (key_linepos < MAX_INPUTLINE-1)
        {
+               char buf[16];
                int len;
+               int blen;
+               blen = u8_fromchar(unicode, buf, sizeof(buf));
+               if (!blen)
+                       return;
                len = (int)strlen(&key_line[key_linepos]);
                // check insert mode, or always insert if at end of line
                if (key_insert || len == 0)
                {
                        // can't use strcpy to move string to right
                        len++;
-                       memmove(&key_line[key_linepos + 1], &key_line[key_linepos], len);
+                       //memmove(&key_line[key_linepos + u8_bytelen(key_line + key_linepos, 1)], &key_line[key_linepos], len);
+                       memmove(&key_line[key_linepos + blen], &key_line[key_linepos], len);
                }
-               key_line[key_linepos] = ascii;
-               key_linepos++;
+               memcpy(key_line + key_linepos, buf, blen);
+               key_linepos += blen;
+               //key_linepos += u8_fromchar(unicode, key_line + key_linepos, sizeof(key_line) - key_linepos - 1);
+               //key_line[key_linepos] = ascii;
+               //key_linepos++;
        }
 }
 
@@ -824,7 +976,6 @@ extern int Nicks_CompleteChatLine(char *buffer, size_t size, unsigned int pos);
 static void
 Key_Message (int key, int ascii)
 {
-
        if (key == K_ENTER || ascii == 10 || ascii == 13)
        {
                if(chat_mode < 0)
@@ -849,7 +1000,7 @@ Key_Message (int key, int ascii)
 
        if (key == K_BACKSPACE) {
                if (chat_bufferlen) {
-                       chat_bufferlen--;
+                       chat_bufferlen = u8_prevbyte(chat_buffer, chat_bufferlen);
                        chat_buffer[chat_bufferlen] = 0;
                }
                return;
@@ -866,8 +1017,10 @@ Key_Message (int key, int ascii)
        if (!ascii)
                return;                                                 // non printable
 
-       chat_buffer[chat_bufferlen++] = ascii;
-       chat_buffer[chat_bufferlen] = 0;
+       chat_bufferlen += u8_fromchar(ascii, chat_buffer+chat_bufferlen, sizeof(chat_buffer) - chat_bufferlen - 1);
+
+       //chat_buffer[chat_bufferlen++] = ascii;
+       //chat_buffer[chat_bufferlen] = 0;
 }
 
 //============================================================================
@@ -1189,7 +1342,7 @@ Key_WriteBindings (qfile_t *f)
                        p = keybindings[j][i];
                        if (p)
                        {
-                               Cmd_QuoteString(bindbuf, sizeof(bindbuf), p, "\"\\");
+                               Cmd_QuoteString(bindbuf, sizeof(bindbuf), p, "\"\\"); // don't need to escape $ because cvars are not expanded inside bind
                                if (j == 0)
                                        FS_Printf(f, "bind %s \"%s\"\n", Key_KeynumToString (i), bindbuf);
                                else
@@ -1267,8 +1420,8 @@ Key_Event (int key, int ascii, qboolean down)
        if (!bind)
                bind = keybindings[key_bmap2][key];
 
-       if (developer.integer >= 1000)
-               Con_Printf("Key_Event(%i, '%c', %s) keydown %i bind \"%s\"\n", key, ascii, down ? "down" : "up", keydown[key], bind ? bind : "");
+       if (developer_insane.integer)
+               Con_DPrintf("Key_Event(%i, '%c', %s) keydown %i bind \"%s\"\n", key, ascii ? ascii : '?', down ? "down" : "up", keydown[key], bind ? bind : "");
 
        if(key_consoleactive)
                keydest = key_console;
@@ -1339,7 +1492,7 @@ Key_Event (int key, int ascii, qboolean down)
                                        if(key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
                                        {
                                                key_consoleactive &= ~KEY_CONSOLEACTIVE_USER;
-                                               MR_ToggleMenu_f ();
+                                               MR_ToggleMenu(1);
                                        }
                                        else
                                                Con_ToggleConsole_f();
@@ -1360,7 +1513,7 @@ Key_Event (int key, int ascii, qboolean down)
                                // csqc has priority over toggle menu if it wants to (e.g. handling escape for UI stuff in-game.. :sick:)
                                q = CL_VM_InputEvent(down, key, ascii);
                                if (!q && down)
-                                       MR_ToggleMenu_f ();
+                                       MR_ToggleMenu(1);
                                break;
 
                        default: