diff --git a/engine/client/console.c b/engine/client/console.c index 3bfe5020..92626d54 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -33,6 +33,7 @@ static CVAR_DEFINE_AUTO( con_fontnum, "-1", FCVAR_ARCHIVE, "console font number static CVAR_DEFINE_AUTO( con_color, "240 180 24", FCVAR_ARCHIVE, "set a custom console color" ); static CVAR_DEFINE_AUTO( scr_drawversion, "1", FCVAR_ARCHIVE, "draw version in menu or screenshots, doesn't affect console" ); static CVAR_DEFINE_AUTO( con_oldfont, "0", 0, "use legacy font from gfx.wad, might be missing or broken" ); +static CVAR_DEFINE_AUTO( con_showcompletion, "1", FCVAR_ARCHIVE, "perform simplified autocompletion while typing" ); static int g_codepage = 0; @@ -130,6 +131,7 @@ typedef struct // console input field_t input; + field_t input_completion; // chatfiled field_t chat; @@ -786,6 +788,7 @@ void Con_Init( void ) Cvar_RegisterVariable( &con_color ); Cvar_RegisterVariable( &scr_drawversion ); Cvar_RegisterVariable( &con_oldfont ); + Cvar_RegisterVariable( &con_showcompletion ); // init the console buffer con.bufsize = CON_TEXTSIZE; @@ -1261,36 +1264,34 @@ static void Field_CharEvent( field_t *edit, int ch ) Field_DrawInputLine ================== */ -static void Field_DrawInputLine( int x, int y, const field_t *edit ) +static int Field_DrawInputLine( int x, int y, const field_t *edit, byte alpha, qboolean cursor ) { int curPos; char str[MAX_SYSPATH]; - const byte *colorDefault = g_color_table[ColorIndex( COLOR_DEFAULT )]; + rgba_t colorDefault; const int prestep = bound( 0, edit->scroll, sizeof( edit->buffer ) - 1 ); const int drawLen = bound( 0, edit->widthInChars, sizeof( str )); const int cursorCharPos = bound( 0, edit->cursor - prestep, sizeof( str )); - str[0] = 0; + memcpy( colorDefault, g_color_table[ColorIndex( COLOR_DEFAULT )], 3 * sizeof( colorDefault[0] )); + colorDefault[3] = alpha; + Q_strncpy( str, edit->buffer + prestep, drawLen ); // draw it CL_DrawString( x, y, str, colorDefault, con.curFont, FONT_DRAW_UTF8 ); - // draw the cursor - if((int)( host.realtime * 4 ) & 1 ) return; // off blink - // calc cursor position str[cursorCharPos] = 0; CL_DrawStringLen( con.curFont, str, &curPos, NULL, FONT_DRAW_UTF8 ); - if( host.key_overstrike ) - { - CL_DrawCharacter( x + curPos, y, '|', colorDefault, con.curFont, 0 ); - } - else - { - CL_DrawCharacter( x + curPos, y, '_', colorDefault, con.curFont, 0 ); - } + // draw the cursor + if( !cursor || (int)( host.realtime * 4 ) & 1 ) + return curPos; // off blink + + CL_DrawCharacter( x + curPos, y, host.key_overstrike ? '|' : '_', colorDefault, con.curFont, 0 ); + + return curPos; } /* @@ -1479,6 +1480,17 @@ CONSOLE LINE EDITING ============================================================================= */ +static void Con_InputCompletion( void ) +{ + if( !con_showcompletion.value ) + return; + + // keep a copy of console input + con.input_completion = con.input; + + Con_CompleteCommand( &con.input_completion, false ); +} + /* ==================== Key_Console @@ -1526,6 +1538,7 @@ void Key_Console( int key ) Con_ClearField( &con.input ); con.input.widthInChars = con.linewidth; Con_Bottom(); + Con_ClearField( &con.input_completion ); if( cls.state == ca_disconnected ) { @@ -1538,8 +1551,9 @@ void Key_Console( int key ) // command completion if( key == K_TAB || key == K_L2_BUTTON ) { - Con_CompleteCommand( &con.input ); + Con_CompleteCommand( &con.input, true ); Con_Bottom(); + Con_ClearField( &con.input_completion ); return; } @@ -1547,12 +1561,14 @@ void Key_Console( int key ) if(( key == K_MWHEELUP && Key_IsDown( K_SHIFT )) || ( key == K_UPARROW ) || (( Q_tolower(key) == 'p' ) && Key_IsDown( K_CTRL ))) { Con_HistoryUp( &con.history, &con.input ); + Con_InputCompletion(); return; } if(( key == K_MWHEELDOWN && Key_IsDown( K_SHIFT )) || ( key == K_DOWNARROW ) || (( Q_tolower(key) == 'n' ) && Key_IsDown( K_CTRL ))) { Con_HistoryDown( &con.history, &con.input ); + Con_InputCompletion(); return; } @@ -1608,6 +1624,7 @@ void Key_Console( int key ) // pass to the normal editline routine Field_KeyDownEvent( &con.input, key ); + Con_InputCompletion(); } /* @@ -1663,7 +1680,7 @@ The input line scrolls horizontally if typing goes beyond the right edge */ static void Con_DrawInput( int lines ) { - int y; + int x, y; // don't draw anything (always draw if not active) if( cls.key_dest != key_console || !con.curFont ) @@ -1671,7 +1688,26 @@ static void Con_DrawInput( int lines ) y = lines - ( con.curFont->charHeight * 2 ); CL_DrawCharacter( con.curFont->charWidths[' '], y, ']', g_color_table[7], con.curFont, 0 ); - Field_DrawInputLine( con.curFont->charWidths[' ']*2, y, &con.input ); + x = Field_DrawInputLine( con.curFont->charWidths[' ']*2, y, &con.input, 255, true ); + + // HACKHACK: avoid rendering issues when scroll != 0 + if( con_showcompletion.value && con.input.scroll == 0 ) + { + int len = Q_strlen( con.input.buffer ); + + if( FBitSet( con_showcompletion.flags, FCVAR_CHANGED )) + { + Con_InputCompletion(); + ClearBits( con_showcompletion.flags, FCVAR_CHANGED ); + } + + // Con_CompleteCommand destroys the buffer. Need to figure out how to make it append only + if( con.input_completion.buffer > len && !Q_strncmp( con.input.buffer, con.input_completion.buffer, len )) + { + con.input_completion.scroll = len; + Field_DrawInputLine( con.curFont->charWidths[' ']*2 + x, y, &con.input_completion, 128, false ); + } + } } /* @@ -1803,7 +1839,7 @@ static void Con_DrawNotify( void ) Con_DrawStringLen( buf, &len, NULL ); Con_DrawString( x, y, buf, g_color_table[7] ); - Field_DrawInputLine( x + len, y, &con.chat ); + Field_DrawInputLine( x + len, y, &con.chat, 255, true ); } ref.dllFuncs.Color4ub( 255, 255, 255, 255 ); @@ -2150,6 +2186,7 @@ void Con_CharEvent( int key ) if( cls.key_dest == key_console ) { Field_CharEvent( &con.input, key ); + Con_InputCompletion(); } else if( cls.key_dest == key_message ) { diff --git a/engine/common/common.h b/engine/common/common.h index 735e444f..3472988e 100644 --- a/engine/common/common.h +++ b/engine/common/common.h @@ -473,7 +473,7 @@ static inline int Cmd_AddCommandWithFlags( const char *cmd_name, xcommand_t func void Cmd_RemoveCommand( const char *cmd_name ); cmd_t *Cmd_Exists( const char *cmd_name ); void Cmd_LookupCmds( void *buffer, void *ptr, setpair_t callback ); -int Cmd_ListMaps( search_t *t , char *lastmapname, size_t len ); +int Cmd_ListMaps( search_t *t , char *lastmapname, size_t len, qboolean silent ); void Cmd_TokenizeString( const char *text ); void Cmd_ExecuteString( const char *text ); void Cmd_ForwardToServer( void ); @@ -680,7 +680,7 @@ void pfnResetTutorMessageDecayData( void ); // // con_utils.c // -void Con_CompleteCommand( field_t *field ); +void Con_CompleteCommand( field_t *field, qboolean print_suggestions ); void Cmd_AutoComplete( char *complete_string ); void Cmd_AutoCompleteClear( void ); void Host_InitializeConfig( file_t *f, const char *config, const char *description ); diff --git a/engine/common/con_utils.c b/engine/common/con_utils.c index 702bb625..cc7f42e1 100644 --- a/engine/common/con_utils.c +++ b/engine/common/con_utils.c @@ -24,7 +24,7 @@ typedef struct autocomplete_list_s { const char *name; int arg; // argument number to handle - qboolean (*func)( const char *s, char *name, int length ); + qboolean (*func)( const char *s, char *name, int length, qboolean print_suggestions ); } autocomplete_list_t; typedef struct @@ -53,7 +53,7 @@ Cmd_ListMaps ===================================== */ -int Cmd_ListMaps( search_t *t, char *lastmapname, size_t len ) +int Cmd_ListMaps( search_t *t, char *lastmapname, size_t len, qboolean silent ) { file_t *f; int i, nummaps; @@ -86,7 +86,7 @@ int Cmd_ListMaps( search_t *t, char *lastmapname, size_t len ) filelen = FS_Read( f, buf, sizeof( buf )); // check all the lumps and some other errors - if( !Mod_TestBmodelLumps( f, t->filenames[i], buf, filelen, true, &entities )) + if( !Mod_TestBmodelLumps( f, t->filenames[i], buf, filelen, silent, &entities )) { FS_Close( f ); continue; @@ -168,7 +168,8 @@ int Cmd_ListMaps( search_t *t, char *lastmapname, size_t len ) default: Q_strncpy( version_description, "??", sizeof( version_description )); break; } - Con_Printf( "%16s (%s) ^3%s^7 ^2%s %s^7\n", mapname, version_description, message, compiler, generator ); + if( !silent ) + Con_Printf( "%16s (%s) ^3%s^7 ^2%s %s^7\n", mapname, version_description, message, compiler, generator ); nummaps++; } @@ -185,7 +186,7 @@ Cmd_GetMapList Prints or complete map filename ===================================== */ -static qboolean Cmd_GetMapList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetMapList( const char *s, char *completedname, int length, qboolean print_suggestions ) { search_t *t; string matchbuf; @@ -199,9 +200,10 @@ static qboolean Cmd_GetMapList( const char *s, char *completedname, int length ) Q_strncpy( completedname, matchbuf, length ); if( t->numfilenames == 1 ) return true; - nummaps = Cmd_ListMaps( t, matchbuf, sizeof( matchbuf )); + nummaps = Cmd_ListMaps( t, matchbuf, sizeof( matchbuf ), !print_suggestions ); - Con_Printf( "\n^3 %d maps found.\n", nummaps ); + if( print_suggestions ) + Con_Printf( "\n^3 %d maps found.\n", nummaps ); Mem_Free( t ); @@ -221,7 +223,7 @@ Cmd_GetDemoList Prints or complete demo filename ===================================== */ -static qboolean Cmd_GetDemoList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetDemoList( const char *s, char *completedname, int length, qboolean print_suggestions ) { search_t *t; string matchbuf; @@ -242,11 +244,14 @@ static qboolean Cmd_GetDemoList( const char *s, char *completedname, int length continue; COM_FileBase( t->filenames[i], matchbuf, sizeof( matchbuf )); - Con_Printf( "%16s\n", matchbuf ); + + if( print_suggestions ) + Con_Printf( "%16s\n", matchbuf ); numdems++; } - Con_Printf( "\n^3 %i demos found.\n", numdems ); + if( print_suggestions ) + Con_Printf( "\n^3 %i demos found.\n", numdems ); Mem_Free( t ); // cut shortestMatch to the amount common with s @@ -268,7 +273,7 @@ Cmd_GetMovieList Prints or complete movie filename ===================================== */ -static qboolean Cmd_GetMovieList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetMovieList( const char *s, char *completedname, int length, qboolean print_suggestions ) { search_t *t; string matchbuf; @@ -288,11 +293,13 @@ static qboolean Cmd_GetMovieList( const char *s, char *completedname, int length continue; COM_FileBase( t->filenames[i], matchbuf, sizeof( matchbuf )); - Con_Printf( "%16s\n", matchbuf ); + if( print_suggestions ) + Con_Printf( "%16s\n", matchbuf ); nummovies++; } - Con_Printf( "\n^3 %i movies found.\n", nummovies ); + if( print_suggestions ) + Con_Printf( "\n^3 %i movies found.\n", nummovies ); Mem_Free( t ); // cut shortestMatch to the amount common with s @@ -315,7 +322,7 @@ Cmd_GetMusicList Prints or complete background track filename ===================================== */ -static qboolean Cmd_GetMusicList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetMusicList( const char *s, char *completedname, int length, qboolean print_suggestions ) { search_t *t; string matchbuf; @@ -337,11 +344,13 @@ static qboolean Cmd_GetMusicList( const char *s, char *completedname, int length continue; COM_FileBase( t->filenames[i], matchbuf, sizeof( matchbuf )); - Con_Printf( "%16s\n", matchbuf ); + if( print_suggestions ) + Con_Printf( "%16s\n", matchbuf ); numtracks++; } - Con_Printf( "\n^3 %i soundtracks found.\n", numtracks ); + if( print_suggestions ) + Con_Printf( "\n^3 %i soundtracks found.\n", numtracks ); Mem_Free(t); // cut shortestMatch to the amount common with s @@ -363,7 +372,7 @@ Cmd_GetSavesList Prints or complete savegame filename ===================================== */ -static qboolean Cmd_GetSavesList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetSavesList( const char *s, char *completedname, int length, qboolean print_suggestions ) { search_t *t; string matchbuf; @@ -383,11 +392,13 @@ static qboolean Cmd_GetSavesList( const char *s, char *completedname, int length continue; COM_FileBase( t->filenames[i], matchbuf, sizeof( matchbuf )); - Con_Printf( "%16s\n", matchbuf ); + if( print_suggestions ) + Con_Printf( "%16s\n", matchbuf ); numsaves++; } - Con_Printf( "\n^3 %i saves found.\n", numsaves ); + if( print_suggestions ) + Con_Printf( "\n^3 %i saves found.\n", numsaves ); Mem_Free( t ); // cut shortestMatch to the amount common with s @@ -410,7 +421,7 @@ Cmd_GetConfigList Prints or complete .cfg filename ===================================== */ -static qboolean Cmd_GetConfigList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetConfigList( const char *s, char *completedname, int length, qboolean print_suggestions ) { search_t *t; string matchbuf; @@ -430,11 +441,13 @@ static qboolean Cmd_GetConfigList( const char *s, char *completedname, int lengt continue; COM_FileBase( t->filenames[i], matchbuf, sizeof( matchbuf )); - Con_Printf( "%16s\n", matchbuf ); + if( print_suggestions ) + Con_Printf( "%16s\n", matchbuf ); numconfigs++; } - Con_Printf( "\n^3 %i configs found.\n", numconfigs ); + if( print_suggestions ) + Con_Printf( "\n^3 %i configs found.\n", numconfigs ); Mem_Free( t ); // cut shortestMatch to the amount common with s @@ -457,7 +470,7 @@ Cmd_GetSoundList Prints or complete sound filename ===================================== */ -static qboolean Cmd_GetSoundList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetSoundList( const char *s, char *completedname, int length, qboolean print_suggestions ) { search_t *t; string matchbuf; @@ -481,11 +494,13 @@ static qboolean Cmd_GetSoundList( const char *s, char *completedname, int length Q_strncpy( matchbuf, t->filenames[i] + sizeof( DEFAULT_SOUNDPATH ) - 1, sizeof( matchbuf )); COM_StripExtension( matchbuf ); - Con_Printf( "%16s\n", matchbuf ); + if( print_suggestions ) + Con_Printf( "%16s\n", matchbuf ); numsounds++; } - Con_Printf( "\n^3 %i sounds found.\n", numsounds ); + if( print_suggestions ) + Con_Printf( "\n^3 %i sounds found.\n", numsounds ); Mem_Free( t ); // cut shortestMatch to the amount common with s @@ -508,7 +523,7 @@ Cmd_GetItemsList Prints or complete item classname (weapons only) ===================================== */ -static qboolean Cmd_GetItemsList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetItemsList( const char *s, char *completedname, int length, qboolean print_suggestions ) { #if !XASH_DEDICATED search_t *t; @@ -530,11 +545,13 @@ static qboolean Cmd_GetItemsList( const char *s, char *completedname, int length continue; COM_FileBase( t->filenames[i], matchbuf, sizeof( matchbuf )); - Con_Printf( "%16s\n", matchbuf ); + if( print_suggestions ) + Con_Printf( "%16s\n", matchbuf ); numitems++; } - Con_Printf( "\n^3 %i items found.\n", numitems ); + if( print_suggestions ) + Con_Printf( "\n^3 %i items found.\n", numitems ); Mem_Free( t ); // cut shortestMatch to the amount common with s @@ -558,7 +575,7 @@ Cmd_GetKeysList Autocomplete for bind command ===================================== */ -static qboolean Cmd_GetKeysList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetKeysList( const char *s, char *completedname, int length, qboolean print_suggestions ) { #if !XASH_DEDICATED size_t i, numkeys; @@ -586,10 +603,12 @@ static qboolean Cmd_GetKeysList( const char *s, char *completedname, int length for( i = 0; i < numkeys; i++ ) { Q_strncpy( matchbuf, keys[i], sizeof( matchbuf )); - Con_Printf( "%16s\n", matchbuf ); + if( print_suggestions ) + Con_Printf( "%16s\n", matchbuf ); } - Con_Printf( "\n^3 %zu keys found.\n", numkeys ); + if( print_suggestions ) + Con_Printf( "\n^3 %zu keys found.\n", numkeys ); if( completedname && length ) { @@ -648,7 +667,7 @@ Cmd_GetCommandsList Autocomplete for bind command ===================================== */ -static qboolean Cmd_GetCommandsAndCvarsList( const char *s, char *completedname, int length, qboolean cmds, qboolean cvars, qboolean toggle ) +static qboolean Cmd_GetCommandsAndCvarsList( const char *s, char *completedname, int length, qboolean cmds, qboolean cvars, qboolean toggle, qboolean print_suggestions ) { size_t i; string matchbuf; @@ -686,10 +705,12 @@ static qboolean Cmd_GetCommandsAndCvarsList( const char *s, char *completedname, for( i = 0; i < list.matchCount; i++ ) { Q_strncpy( matchbuf, list.cmds[i], sizeof( matchbuf )); - Con_Printf( "%16s\n", matchbuf ); + if( print_suggestions ) + Con_Printf( "%16s\n", matchbuf ); } - Con_Printf( "\n^3 %i %s found.\n", list.matchCount, cmds ? "commands" : "variables" ); + if( print_suggestions ) + Con_Printf( "\n^3 %i %s found.\n", list.matchCount, cmds ? "commands" : "variables" ); if( completedname && length ) { @@ -718,9 +739,9 @@ Cmd_GetCommandsList Autocomplete for bind command ===================================== */ -static qboolean Cmd_GetCommandsList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetCommandsList( const char *s, char *completedname, int length, qboolean print_suggestions ) { - return Cmd_GetCommandsAndCvarsList( s, completedname, length, true, true, false ); + return Cmd_GetCommandsAndCvarsList( s, completedname, length, true, true, false, print_suggestions ); } /* @@ -730,10 +751,10 @@ Cmd_GetCvarList Autocomplete for bind command ===================================== */ -static qboolean Cmd_GetCvarsList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetCvarsList( const char *s, char *completedname, int length, qboolean print_suggestions ) { qboolean toggle = !Q_stricmp( Cmd_Argv( 0 ), "toggle" ); - return Cmd_GetCommandsAndCvarsList( s, completedname, length, false, true, toggle ); + return Cmd_GetCommandsAndCvarsList( s, completedname, length, false, true, toggle, print_suggestions ); } /* @@ -743,7 +764,7 @@ Cmd_GetCustomList Prints or complete .HPK filenames ===================================== */ -static qboolean Cmd_GetCustomList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetCustomList( const char *s, char *completedname, int length, qboolean print_suggestions ) { search_t *t; string matchbuf; @@ -763,11 +784,13 @@ static qboolean Cmd_GetCustomList( const char *s, char *completedname, int lengt continue; COM_FileBase( t->filenames[i], matchbuf, sizeof( matchbuf )); - Con_Printf( "%16s\n", matchbuf ); + if( print_suggestions ) + Con_Printf( "%16s\n", matchbuf ); numitems++; } - Con_Printf( "\n^3 %i items found.\n", numitems ); + if( print_suggestions ) + Con_Printf( "\n^3 %i items found.\n", numitems ); Mem_Free( t ); // cut shortestMatch to the amount common with s @@ -789,7 +812,7 @@ Cmd_GetGameList Prints or complete gamedir name ===================================== */ -static qboolean Cmd_GetGamesList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetGamesList( const char *s, char *completedname, int length, qboolean print_suggestions ) { int i, numgamedirs; string gamedirs[MAX_MODS]; @@ -814,10 +837,12 @@ static qboolean Cmd_GetGamesList( const char *s, char *completedname, int length for( i = 0; i < numgamedirs; i++ ) { Q_strncpy( matchbuf, gamedirs[i], sizeof( matchbuf )); - Con_Printf( "%16s\n", matchbuf ); + if( print_suggestions ) + Con_Printf( "%16s\n", matchbuf ); } - Con_Printf( "\n^3 %i games found.\n", numgamedirs ); + if( print_suggestions ) + Con_Printf( "\n^3 %i games found.\n", numgamedirs ); // cut shortestMatch to the amount common with s if( completedname && length ) @@ -838,7 +863,7 @@ Cmd_GetCDList Prints or complete CD command name ===================================== */ -static qboolean Cmd_GetCDList( const char *s, char *completedname, int length ) +static qboolean Cmd_GetCDList( const char *s, char *completedname, int length, qboolean print_suggestions ) { int i, numcdcommands; string cdcommands[8]; @@ -875,10 +900,12 @@ static qboolean Cmd_GetCDList( const char *s, char *completedname, int length ) for( i = 0; i < numcdcommands; i++ ) { Q_strncpy( matchbuf, cdcommands[i], sizeof( matchbuf )); - Con_Printf( "%16s\n", matchbuf ); + if( print_suggestions ) + Con_Printf( "%16s\n", matchbuf ); } - Con_Printf( "\n^3 %i commands found.\n", numcdcommands ); + if( print_suggestions ) + Con_Printf( "\n^3 %i commands found.\n", numcdcommands ); // cut shortestMatch to the amount common with s if( completedname && length ) @@ -1116,14 +1143,14 @@ Autocomplete filename for various cmds ============ */ -static qboolean Cmd_AutocompleteName( const char *source, int arg, char *buffer, size_t bufsize ) +static qboolean Cmd_AutocompleteName( const char *source, int arg, char *buffer, size_t bufsize, qboolean print_suggestions ) { int i; for( i = 0; i < ARRAYSIZE( cmd_list ); i++ ) { if( cmd_list[i].arg == arg && Cmd_CheckName( cmd_list[i].name )) - return cmd_list[i].func( source, buffer, bufsize ); + return cmd_list[i].func( source, buffer, bufsize, print_suggestions ); } return false; @@ -1202,7 +1229,7 @@ Con_CompleteCommand perform Tab expansion =============== */ -void Con_CompleteCommand( field_t *field ) +void Con_CompleteCommand( field_t *field, qboolean print_suggestions ) { field_t temp; string filename; @@ -1249,7 +1276,7 @@ void Con_CompleteCommand( field_t *field ) temp = *con.completionField; // autocomplete second arg - if( (Cmd_Argc() >= 2) || ((Cmd_Argc() == 1) && nextcmd) ) + if(( Cmd_Argc() >= 2 ) || ( Cmd_Argc() == 1 && nextcmd )) { con.completionBuffer = Cmd_Argv( Cmd_Argc() - 1 ); @@ -1260,7 +1287,7 @@ void Con_CompleteCommand( field_t *field ) if( !COM_CheckStringEmpty( con.completionBuffer ) ) return; - if( Cmd_AutocompleteName( con.completionBuffer, Cmd_Argc() - 1, filename, sizeof( filename ) ) ) + if( Cmd_AutocompleteName( con.completionBuffer, Cmd_Argc() - 1, filename, sizeof( filename ), print_suggestions )) { con.completionField->buffer[0] = 0; @@ -1311,11 +1338,14 @@ void Con_CompleteCommand( field_t *field ) con.completionField->cursor = Q_strlen( con.completionField->buffer ); Con_ConcatRemaining( temp.buffer, con.completionString ); - Con_Printf( "]%s\n", con.completionField->buffer ); - // run through again, printing matches - Cmd_LookupCmds( NULL, NULL, (setpair_t)Con_PrintCmdMatches ); - Cvar_LookupVars( 0, NULL, NULL, (setpair_t)Con_PrintCvarMatches ); + if( print_suggestions ) + { + Con_Printf( "]%s\n", con.completionField->buffer ); + + Cmd_LookupCmds( NULL, NULL, (setpair_t)Con_PrintCmdMatches ); + Cvar_LookupVars( 0, NULL, NULL, (setpair_t)Con_PrintCvarMatches ); + } } } @@ -1337,7 +1367,7 @@ void Cmd_AutoComplete( char *complete_string ) Q_strncpy( input.buffer, complete_string, sizeof( input.buffer ) ); input.cursor = input.scroll = 0; - Con_CompleteCommand( &input ); + Con_CompleteCommand( &input, true ); // setup output if( input.buffer[0] == '\\' || input.buffer[0] == '/' ) diff --git a/engine/server/sv_cmds.c b/engine/server/sv_cmds.c index 5bd76526..e96edf1b 100644 --- a/engine/server/sv_cmds.c +++ b/engine/server/sv_cmds.c @@ -247,7 +247,7 @@ static void SV_Maps_f( void ) return; } - nummaps = Cmd_ListMaps( mapList, NULL, 0 ); + nummaps = Cmd_ListMaps( mapList, NULL, 0, false ); Mem_Free( mapList );