]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - keys.c
reset callcount in prvm_profile
[xonotic/darkplaces.git] / keys.c
diff --git a/keys.c b/keys.c
index d069adfa3f9590817e8b09b54c56bde4c6ab271e..82c3edf6fa47501bec130fc30620157d8746a349 100644 (file)
--- a/keys.c
+++ b/keys.c
@@ -28,15 +28,14 @@ key up events are sent even if in console mode
 */
 
 #define MAX_INPUTLINE 256
+int                    edit_line = 31;
+int                    history_line = 31;
 char           key_lines[32][MAX_INPUTLINE];
 int                    key_linepos;
 static int     ctrl_down = false;
 static int     key_lastpress;
 int                    key_insert = true;      // insert key toggle (for editing)
 
-int         edit_line = 0;
-int         history_line = 0;
-
 keydest_t      key_dest;
 int                    key_consoleactive;
 
@@ -312,8 +311,10 @@ Key_Console (int key, char ascii)
                Cbuf_AddText (key_lines[edit_line]+1);  // skip the ]
                Cbuf_AddText ("\n");
                Con_Printf("%s\n",key_lines[edit_line]);
-               edit_line = (edit_line + 1) & 31;
+               // LordHavoc: redesigned edit_line/history_line
+               edit_line = 31;
                history_line = edit_line;
+               memmove(key_lines[0], key_lines[1], sizeof(key_lines[0]) * edit_line);
                key_lines[edit_line][0] = ']';
                key_lines[edit_line][1] = 0;    // EvilTypeGuy: null terminate
                key_linepos = 1;
@@ -384,30 +385,23 @@ Key_Console (int key, char ascii)
 
        if (key == K_UPARROW || key == K_KP_UPARROW || (key == 'p' && keydown[K_CTRL]))
        {
-               do
+               if (history_line > 0 && key_lines[history_line-1][1])
                {
-                       history_line = (history_line - 1) & 31;
-               } while (history_line != edit_line
-                               && !key_lines[history_line][1]);
-               if (history_line == edit_line)
-                       history_line = (edit_line+1)&31;
-               strcpy(key_lines[edit_line], key_lines[history_line]);
-               key_linepos = strlen(key_lines[edit_line]);
+                       history_line--;
+                       strcpy(key_lines[edit_line], key_lines[history_line]);
+                       key_linepos = strlen(key_lines[edit_line]);
+               }
                return;
        }
 
        if (key == K_DOWNARROW || key == K_KP_DOWNARROW || (key == 'n' && keydown[K_CTRL]))
        {
-               if (history_line == edit_line) return;
-               do
-               {
-                       history_line = (history_line + 1) & 31;
-               }
-               while (history_line != edit_line
-                       && !key_lines[history_line][1]);
-               if (history_line == edit_line)
+               history_line++;
+               if (history_line >= edit_line)
                {
+                       history_line = edit_line;
                        key_lines[edit_line][0] = ']';
+                       key_lines[edit_line][1] = 0;
                        key_linepos = 1;
                }
                else
@@ -420,15 +414,15 @@ Key_Console (int key, char ascii)
 
        if (key == K_PGUP || key == K_KP_PGUP || key == K_MWHEELUP)
        {
-               con_backscroll += ((int) vid.conheight >> 5);
-               if (con_backscroll > con_totallines - (vid.conheight>>3) - 1)
-                       con_backscroll = con_totallines - (vid.conheight>>3) - 1;
+               con_backscroll += ((int) vid_conheight.integer >> 5);
+               if (con_backscroll > con_totallines - (vid_conheight.integer>>3) - 1)
+                       con_backscroll = con_totallines - (vid_conheight.integer>>3) - 1;
                return;
        }
 
        if (key == K_PGDN || key == K_KP_PGDN || key == K_MWHEELDOWN)
        {
-               con_backscroll -= ((int) vid.conheight >> 5);
+               con_backscroll -= ((int) vid_conheight.integer >> 5);
                if (con_backscroll < 0)
                        con_backscroll = 0;
                return;
@@ -436,7 +430,7 @@ Key_Console (int key, char ascii)
 
        if (key == K_HOME || key == K_KP_HOME)
        {
-               con_backscroll = con_totallines - (vid.conheight>>3) - 1;
+               con_backscroll = con_totallines - (vid_conheight.integer>>3) - 1;
                return;
        }
 
@@ -452,27 +446,17 @@ Key_Console (int key, char ascii)
 
        if (key_linepos < MAX_INPUTLINE-1)
        {
-               int i;
-
-               if (key_insert) // check insert mode
+               int len;
+               len = strlen(&key_lines[edit_line][key_linepos]);
+               // check insert mode, or always insert if at end of line
+               if (key_insert || len == 0)
                {
-                       // can't do strcpy to move string to right
-                       i = strlen(key_lines[edit_line]) - 1;
-
-                       if (i == 254)
-                               i--;
-
-                       for (; i >= key_linepos; i--)
-                               key_lines[edit_line][i + 1] = key_lines[edit_line][i];
+                       // can't use strcpy to move string to right
+                       len++;
+                       memmove(&key_lines[edit_line][key_linepos + 1], &key_lines[edit_line][key_linepos], len);
                }
-
-               // only null terminate if at the end
-               i = key_lines[edit_line][key_linepos];
                key_lines[edit_line][key_linepos] = ascii;
                key_linepos++;
-
-               if (!i)
-                       key_lines[edit_line][key_linepos] = 0;
        }
 }
 
@@ -883,6 +867,12 @@ Key_Event (int key, char ascii, qboolean down)
        if (key == K_ESCAPE) {
                if (!down)
                        return;
+               // ctrl-escape is a safety measure
+               if (ctrl_down)
+               {
+                       Con_ToggleConsole_f ();
+                       return;
+               }
                switch (key_dest) {
                        case key_message:
                                Key_Message (key, ascii);