From a73a779486fe11f30215b4f9659b2843ca211ec1 Mon Sep 17 00:00:00 2001 From: "Anton E. Gavrilov" Date: Mon, 22 May 2000 09:24:07 +0000 Subject: [PATCH] Console editing stuff --- include/console.h | 1 + source/console.c | 29 ++++-- source/keys.c | 254 ++++++++++++++++++++++++++-------------------- 3 files changed, 164 insertions(+), 120 deletions(-) diff --git a/include/console.h b/include/console.h index ec76a16..b7ca799 100644 --- a/include/console.h +++ b/include/console.h @@ -41,6 +41,7 @@ typedef struct int current; // line where next message will be printed int x; // offset in current line for next print int display; // bottom of console displays this line + int numlines; // number of non-blank text lines, used for backscroling } console_t; extern console_t con_main; diff --git a/source/console.c b/source/console.c index 23a6b37..3beface 100644 --- a/source/console.c +++ b/source/console.c @@ -128,6 +128,8 @@ Con_Clear_f */ void Con_Clear_f (void) { + con_main.numlines = 0; + con_chat.numlines = 0; memset (con_main.text, ' ', CON_TEXTSIZE); memset (con_chat.text, ' ', CON_TEXTSIZE); } @@ -154,6 +156,8 @@ Con_MessageMode_f */ void Con_MessageMode_f (void) { + if (cls.state != ca_active) + return; chat_team = false; key_dest = key_message; } @@ -165,6 +169,8 @@ Con_MessageMode2_f */ void Con_MessageMode2_f (void) { + if (cls.state != ca_active) + return; chat_team = true; key_dest = key_message; } @@ -285,6 +291,8 @@ void Con_Linefeed (void) if (con->display == con->current) con->display++; con->current++; + if (con->numlines < con_totallines) + con->numlines++; memset (&con->text[(con->current%con_totallines)*con_linewidth] , ' ', con_linewidth); } @@ -457,31 +465,30 @@ void Con_DrawInput (void) int y; int i; char *text; + char temp[MAXCMDLINE]; if (key_dest != key_console && cls.state == ca_active) return; // don't draw anything (allways draw if not active) - text = key_lines[edit_line]; - -// add the cursor frame - text[key_linepos] = 10+((int)(realtime*con_cursorspeed)&1); - + text = strcpy (temp, key_lines[edit_line]); + // fill out remainder with spaces - for (i=key_linepos+1 ; i< con_linewidth ; i++) + for (i=strlen(text) ; i < MAXCMDLINE ; i++) text[i] = ' '; - + +// add the cursor frame + if ( (int)(realtime*con_cursorspeed) & 1 ) + text[key_linepos] = 11; + // prestep if horizontally scrolling if (key_linepos >= con_linewidth) text += 1 + key_linepos - con_linewidth; - + // draw it y = con_vislines-22; for (i=0 ; i - else if (CheckForCommand()) - Cbuf_AddText (key_lines[edit_line]+1); // valid command - else - { // convert to a chat message - if (cls.state >= ca_connected) + + switch (key) + { + case K_ENTER: + // backslash text are commands + if (key_lines[edit_line][1] == '/' && key_lines[edit_line][2] == '/') + goto no_lf; + else if (key_lines[edit_line][1] == '\\' || key_lines[edit_line][1] == '/') + Cbuf_AddText (key_lines[edit_line]+2); // skip the ]/ + else if (cl_chatmode->value != 2 && CheckForCommand()) + Cbuf_AddText (key_lines[edit_line]+1); // valid command + else if ((cls.state >= ca_connected && cl_chatmode->value == 1) || cl_chatmode->value == 2) + { + if (cls.state < ca_connected) // can happen if cl_constyle == 2 + goto no_lf; // drop the whole line + + // convert to a chat message Cbuf_AddText ("say "); - Cbuf_AddText (key_lines[edit_line]+1); // skip the > - } + Cbuf_AddText (key_lines[edit_line]+1); + } + else + 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; - history_line = edit_line; - key_lines[edit_line][0] = ']'; - key_linepos = 1; - if (cls.state == ca_disconnected) - SCR_UpdateScreen (); // force an update, because the command - // may take some time - return; - } - - if (key == K_TAB) - { // command completion - CompleteCommand (); - return; - } - - if (key == K_BACKSPACE || key == K_LEFTARROW) - { - if (key_linepos > 1) - key_linepos--; - return; - } - - if (key == K_UPARROW) - { - do - { - 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]); - return; - } - - if (key == K_DOWNARROW) - { - 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) - { + Cbuf_AddText ("\n"); +no_lf: + Con_Printf ("%s\n",key_lines[edit_line]); + edit_line = (edit_line + 1) & 31; + history_line = edit_line; key_lines[edit_line][0] = ']'; + key_lines[edit_line][1] = 0; key_linepos = 1; - } - else - { + if (cls.state == ca_disconnected) + SCR_UpdateScreen (); // force an update, because the command + // may take some time + return; + + case K_TAB: + // command completion + CompleteCommand (); + return; + + case K_BACKSPACE: + if (key_linepos > 1) + { + strcpy(key_lines[edit_line] + key_linepos - 1, key_lines[edit_line] + key_linepos); + key_linepos--; + } + return; + + case K_DEL: + if (key_linepos < strlen(key_lines[edit_line])) + strcpy(key_lines[edit_line] + key_linepos, key_lines[edit_line] + key_linepos + 1); + return; + + case K_RIGHTARROW: + if (key_linepos < strlen(key_lines[edit_line])) + key_linepos++; + return; + + case K_LEFTARROW: + if (key_linepos > 1) + key_linepos--; + return; + + case K_UPARROW: + do { + 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]); - } - return; - } + return; - if (key == K_PGUP || key==K_MWHEELUP) - { - con->display -= 2; - return; - } + case K_DOWNARROW: + if (history_line == edit_line) return; + do { + history_line = (history_line + 1) & 31; + } while (history_line != edit_line + && !key_lines[history_line][1]); - if (key == K_PGDN || key==K_MWHEELDOWN) - { - con->display += 2; - if (con->display > con->current) - con->display = con->current; - return; - } + if (history_line == edit_line) { + key_lines[edit_line][0] = ']'; + key_lines[edit_line][1] = 0; + key_linepos = 1; + } else { + strcpy(key_lines[edit_line], key_lines[history_line]); + key_linepos = strlen(key_lines[edit_line]); + } + return; - if (key == K_HOME) - { - con->display = con->current - con_totallines + 10; - return; - } + case K_MWHEELUP: + case K_PGUP: + if (con->display - con->current + con->numlines > 2) + con->display -= 2; + return; - if (key == K_END) - { - con->display = con->current; - return; + case K_MWHEELDOWN: + case K_PGDN: + con->display += 2; + if (con->display > con->current) + con->display = con->current; + return; + + case K_HOME: + if (keydown[K_CTRL]) + { + if (con->numlines > 10) + con->display = con->current - con->numlines + 10; + } + else + key_linepos = 1; + return; + + case K_END: + if (keydown[K_CTRL]) + con->display = con->current; + else + key_linepos = strlen(key_lines[edit_line]); + return; } - #ifdef _WIN32 if ((key=='V' || key=='v') && GetKeyState(VK_CONTROL)<0) { if (OpenClipboard(NULL)) { @@ -382,12 +403,14 @@ void Key_Console (int key) strcpy(textCopied, clipText); /* Substitutes a NULL for every token */strtok(textCopied, "\n\r\b"); i = strlen(textCopied); - if (i+key_linepos>=MAXCMDLINE) - i=MAXCMDLINE-key_linepos; - if (i>0) { - textCopied[i]=0; - strcat(key_lines[edit_line], textCopied); - key_linepos+=i;; + if (i + strlen(key_lines[edit_line]) >= MAXCMDLINE-1) + i = MAXCMDLINE-1 - strlen(key_lines[edit_line]); + if (i > 0) + { // insert the string + memcpy (key_lines[edit_line] + key_linepos + i, + key_lines[edit_line] + key_linepos, strlen(key_lines[edit_line]) - key_linepos + 1); + memcpy (key_lines[edit_line] + key_linepos, textCopied, i); + key_linepos += i; } free(textCopied); } @@ -401,12 +424,18 @@ void Key_Console (int key) if (key < 32 || key > 127) return; // non printable - + if (key_linepos < MAXCMDLINE-1) { + i = strlen(key_lines[edit_line]) - 1; + if (i == MAXCMDLINE-2) i--; + for (; i >= key_linepos; i--) + key_lines[edit_line][i + 1] = key_lines[edit_line][i]; + i = key_lines[edit_line][key_linepos]; key_lines[edit_line][key_linepos] = key; key_linepos++; - key_lines[edit_line][key_linepos] = 0; + if (!i) // // only null terminate if at the end + key_lines[edit_line][key_linepos] = 0; } } @@ -676,6 +705,7 @@ void Key_Init (void) consolekeys[K_UPARROW] = true; consolekeys[K_DOWNARROW] = true; consolekeys[K_BACKSPACE] = true; + consolekeys[K_DEL] = true; consolekeys[K_HOME] = true; consolekeys[K_END] = true; consolekeys[K_PGUP] = true; @@ -723,7 +753,9 @@ void Key_Init (void) Cmd_AddCommand ("unbind",Key_Unbind_f); Cmd_AddCommand ("unbindall",Key_Unbindall_f); - + cl_chatmode = Cvar_Get ("cl_chatmode", "1", 0, + "Controls when console text will be treated as a chat message" + "0 - never, 1 - smart, 2 - always"); } /* @@ -757,17 +789,20 @@ void Key_Event (int key, qboolean down) if (down) { key_repeats[key]++; - if (key != K_BACKSPACE - && key != K_PAUSE - && key != K_PGUP - && key != K_PGDN - && key_repeats[key] > 1) + if ((key != K_BACKSPACE && key != K_DEL + && key != K_LEFTARROW && key != K_RIGHTARROW + && key != K_PGUP && key != K_PGDN + && key_repeats[key] > 1) || + (key_dest == key_game && cls.state == ca_active)) return; // ignore most autorepeats if (key >= 200 && !keybindings[key]) Con_Printf ("%s is unbound, hit F4 to set.\n", Key_KeynumToString (key) ); } +// Exit message mode is disconnected + if (key_dest == key_message && cls.state != ca_active) + key_dest = key_console; // // handle escape specialy, so the user can never unbind it @@ -806,7 +841,7 @@ void Key_Event (int key, qboolean down) kb = keybindings[key]; if (kb && kb[0] == '+') { - snprintf (cmd, sizeof(cmd), "-%s %i\n", kb+1, key); + snprintf (cmd, sizeof(cmd), "-%s %i\n", kb+1, key); Cbuf_AddText (cmd); } if (keyshift[key] != key) @@ -814,7 +849,7 @@ void Key_Event (int key, qboolean down) kb = keybindings[keyshift[key]]; if (kb && kb[0] == '+') { - snprintf (cmd, sizeof(cmd), "-%s %i\n", kb+1, key); + snprintf (cmd, sizeof(cmd), "-%s %i\n", kb+1, key); Cbuf_AddText (cmd); } } @@ -824,7 +859,8 @@ void Key_Event (int key, qboolean down) // // during demo playback, most keys bring up the main menu // - if (cls.demoplayback && down && consolekeys[key] && key_dest == key_game) + if (cls.demoplayback && down && consolekeys[key] && key_dest == key_game + && key != K_CTRL && key != K_DEL && key != K_HOME && key != K_END && key != K_TAB) { M_ToggleMenu_f (); return;