X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=console.c;h=218ea632fbb918b3c78d0c9ac73d8f68dcf6d221;hb=a90e84271f385438c9ce8bd45513d83a26f98180;hp=be48c8df52e558fbec75ae141ea9286a3e231a80;hpb=9f6e4476fe8049342ac61c87ab7286912c1ff97c;p=xonotic%2Fdarkplaces.git diff --git a/console.c b/console.c index be48c8df..218ea632 100644 --- a/console.c +++ b/console.c @@ -23,8 +23,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #endif #ifndef _MSC_VER +#ifndef __BORLANDC__ #include #endif +#endif #ifdef WIN32 #include #endif @@ -43,28 +45,29 @@ int con_totallines; // total lines in console scrollback int con_backscroll; // lines up from bottom to display int con_current; // where next message will be printed int con_x; // offset in current line for next print -char *con_text=0; +char *con_text = 0; -cvar_t con_notifytime = {"con_notifytime","3"}; //seconds -cvar_t logfile = {"logfile","0"}; +cvar_t con_notifytime = {CVAR_SAVE, "con_notifytime","3"}; //seconds +cvar_t logfile = {0, "logfile","0"}; #define NUM_CON_TIMES 4 float con_times[NUM_CON_TIMES]; // realtime time the line was generated - // for transparent notify lines + // for transparent notify lines int con_vislines; qboolean con_debuglog; -#define MAXCMDLINE 256 +#define MAXCMDLINE 256 extern char key_lines[32][MAXCMDLINE]; extern int edit_line; extern int key_linepos; +extern int key_insert; qboolean con_initialized; -int con_notifylines; // scan lines to clear for notify lines +int con_notifylines; // scan lines to clear for notify lines extern void M_Menu_Main_f (void); @@ -78,20 +81,18 @@ void Con_ToggleConsole_f (void) if (key_dest == key_console) { if (cls.state == ca_connected) - { +// { key_dest = key_game; - key_lines[edit_line][1] = 0; // clear any typing - key_linepos = 1; - } +// key_lines[edit_line][1] = 0; // clear any typing +// key_linepos = 1; +// } else - { M_Menu_Main_f (); - } } else key_dest = key_console; - SCR_EndLoadingPlaque (); +// SCR_EndLoadingPlaque (); memset (con_times, 0, sizeof(con_times)); } @@ -385,14 +386,14 @@ void Con_Printf (char *fmt, ...) { va_list argptr; char msg[MAXPRINTMSG]; - static qboolean inupdate; +// static qboolean inupdate; va_start (argptr,fmt); vsprintf (msg,fmt,argptr); va_end (argptr); // also echo to debugging console - Sys_Printf ("%s", msg); // also echo to debugging console + Sys_Printf ("%s", msg); // log all messages to file if (con_debuglog) @@ -408,6 +409,8 @@ void Con_Printf (char *fmt, ...) Con_Print (msg); // update the screen if the console is displayed + // LordHavoc: I don't think there's a real need for this + /* // LordHavoc: don't print text while loading scripts if (cls.state != ca_disconnected) if (cls.signon != SIGNONS && !scr_disabled_for_loading ) @@ -421,6 +424,7 @@ void Con_Printf (char *fmt, ...) inupdate = false; } } + */ } /* @@ -484,39 +488,53 @@ DRAWING Con_DrawInput The input line scrolls horizontally if typing goes beyond the right edge + +Modified by EvilTypeGuy eviltypeguy@qeradiant.com ================ */ void Con_DrawInput (void) { int y; char *text; + char editlinecopy[256]; if (key_dest != key_console && !con_forcedup) return; // don't draw anything - text = key_lines[edit_line]; + text = strcpy(editlinecopy, key_lines[edit_line]); + y = strlen(text); + + // Advanced Console Editing by Radix radix@planetquake.com + // Added/Modified by EvilTypeGuy eviltypeguy@qeradiant.com + // use strlen of edit_line instead of key_linepos to allow editing + // of early characters w/o erasing + + // add the cursor frame + if ((int)(realtime*con_cursorspeed) & 1) // cursor is visible + text[key_linepos] = 11 + 130 * key_insert; // either solid or triangle facing right -// add the cursor frame - text[key_linepos] = 10+((int)(realtime*con_cursorspeed)&1); + text[key_linepos + 1] = 0; // LordHavoc: null terminate, rather than padding with spaces + // text[key_linepos] = 10 + ((int)(realtime*con_cursorspeed) & 1); - text[key_linepos+1] = 0; // LordHavoc: null terminate, rather than padding with spaces -// fill out remainder with spaces -// for (i=key_linepos+1 ; i< con_linewidth ; i++) -// text[i] = ' '; + + // fill out remainder with spaces + // for (i=key_linepos+1 ; i< con_linewidth ; i++) + // text[i] = ' '; -// prestep if horizontally scrolling + // prestep if horizontally scrolling if (key_linepos >= con_linewidth) text += 1 + key_linepos - con_linewidth; -// draw it - y = con_vislines-16; + // draw it + y = con_vislines - 16; + + // for (i=0 ; i maxlen) + maxlen = len; + walk++; + } + maxlen += 1; -// during startup for sound / cd warnings - Con_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n"); + while (*list) { + len = strlen(*list); + if (pos + maxlen >= width) { + Con_Printf("\n"); + pos = 0; + } - Con_Printf (text); + Con_Printf("%s", *list); + for (i = 0; i < (maxlen - len); i++) + Con_Printf(" "); - Con_Printf ("Press a key.\n"); - Con_Printf("\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n"); + pos += maxlen; + list++; + } - key_count = -2; // wait for a key down and up - key_dest = key_console; + if (pos) + Con_Printf("\n\n"); +} - do - { - t1 = Sys_FloatTime (); - SCR_UpdateScreen (); - Sys_SendKeyEvents (); - t2 = Sys_FloatTime (); - realtime += t2-t1; // make the cursor blink - } while (key_count < 0); - - Con_Printf ("\n"); - key_dest = key_game; - realtime = 0; // put the cursor back to invisible +/* + Con_CompleteCommandLine + + New function for tab-completion system + Added by EvilTypeGuy + Thanks to Fett erich@heintz.com + Thanks to taniwha + +*/ +void +Con_CompleteCommandLine (void) +{ + char *cmd = ""; + char *s; + int c, v, a, i; + int cmd_len; + char **list[3] = {0, 0, 0}; + + s = key_lines[edit_line] + 1; + // Count number of possible matches + c = Cmd_CompleteCountPossible(s); + v = Cvar_CompleteCountPossible(s); + a = Cmd_CompleteAliasCountPossible(s); + + if (!(c + v + a)) // No possible matches + return; + + if (c + v + a == 1) { + if (c) + list[0] = Cmd_CompleteBuildList(s); + else if (v) + list[0] = Cvar_CompleteBuildList(s); + else + list[0] = Cmd_CompleteAliasBuildList(s); + cmd = *list[0]; + cmd_len = strlen (cmd); + } else { + if (c) + cmd = *(list[0] = Cmd_CompleteBuildList(s)); + if (v) + cmd = *(list[1] = Cvar_CompleteBuildList(s)); + if (a) + cmd = *(list[2] = Cmd_CompleteAliasBuildList(s)); + + cmd_len = strlen (s); + do { + for (i = 0; i < 3; i++) { + char ch = cmd[cmd_len]; + char **l = list[i]; + if (l) { + while (*l && (*l)[cmd_len] == ch) + l++; + if (*l) + break; + } + } + if (i == 3) + cmd_len++; + } while (i == 3); + // 'quakebar' + Con_Printf("\n\35"); + for (i = 0; i < con_linewidth - 4; i++) + Con_Printf("\36"); + Con_Printf("\37\n"); + + // Print Possible Commands + if (c) { + Con_Printf("%i possible command%s\n", c, (c > 1) ? "s: " : ":"); + Con_DisplayList(list[0]); + } + + if (v) { + Con_Printf("%i possible variable%s\n", v, (v > 1) ? "s: " : ":"); + Con_DisplayList(list[1]); + } + + if (a) { + Con_Printf("%i possible aliases%s\n", a, (a > 1) ? "s: " : ":"); + Con_DisplayList(list[2]); + } + return; + } + + if (cmd) { + strncpy(key_lines[edit_line] + 1, cmd, cmd_len); + key_linepos = cmd_len + 1; + if (c + v + a == 1) { + key_lines[edit_line][key_linepos] = ' '; + key_linepos++; + } + key_lines[edit_line][key_linepos] = 0; + } + for (i = 0; i < 3; i++) + if (list[i]) + qfree (list[i]); }