/* ================== MenuField_Init ================== */ void MenuField_Init( menufield_s* m ) { int l; int w; int h; MField_Clear( &m->field ); if (m->generic.flags & QMF_SMALLFONT) { w = SMALLCHAR_WIDTH; h = SMALLCHAR_HEIGHT; } else { w = BIGCHAR_WIDTH; h = BIGCHAR_HEIGHT; } if (m->generic.name) { l = (strlen( m->generic.name )+1) * w; } else { l = 0; } m->generic.left = m->generic.x - l; m->generic.top = m->generic.y; m->generic.right = m->generic.x + w + m->field.widthInChars*w; m->generic.bottom = m->generic.y + h; }
/* ================ CG_MessageMode_f ================ */ void CG_MessageMode_f( void ) { Q_strncpyz( cg.messageCommand, "say", sizeof (cg.messageCommand) ); Q_strncpyz( cg.messagePrompt, "Say:", sizeof (cg.messagePrompt) ); MField_Clear( &cg.messageField ); cg.messageField.widthInChars = 30; Key_SetCatcher( Key_GetCatcher( ) ^ KEYCATCH_MESSAGE ); }
/* ================ CG_LoadConsoleHistory Load the console history from cl_consoleHistory ================ */ void CG_LoadConsoleHistory( void ) { char *token, *text_p; int i, numChars, numLines = 0; fileHandle_t f; consoleSaveBufferSize = trap_FS_FOpenFile( CONSOLE_HISTORY_FILE, &f, FS_READ ); if( !f ) { Com_Printf( "Couldn't read %s.\n", CONSOLE_HISTORY_FILE ); return; } if( consoleSaveBufferSize <= MAX_CONSOLE_SAVE_BUFFER && trap_FS_Read( consoleSaveBuffer, consoleSaveBufferSize, f ) == consoleSaveBufferSize ) { text_p = consoleSaveBuffer; for( i = COMMAND_HISTORY - 1; i >= 0; i-- ) { if( !*( token = COM_Parse( &text_p ) ) ) break; historyEditLines[ i ].cursor = atoi( token ); if( !*( token = COM_Parse( &text_p ) ) ) break; historyEditLines[ i ].scroll = atoi( token ); if( !*( token = COM_Parse( &text_p ) ) ) break; numChars = atoi( token ); text_p++; if( numChars > ( strlen( consoleSaveBuffer ) - ( text_p - consoleSaveBuffer ) ) ) { Com_DPrintf( S_COLOR_YELLOW "WARNING: probable corrupt history\n" ); break; } Com_Memcpy( historyEditLines[ i ].buffer, text_p, numChars ); historyEditLines[ i ].buffer[ numChars ] = '\0'; text_p += numChars; numLines++; } memmove( &historyEditLines[ 0 ], &historyEditLines[ i + 1 ], numLines * sizeof( mfield_t ) ); for( i = numLines; i < COMMAND_HISTORY; i++ ) MField_Clear( &historyEditLines[ i ] ); historyLine = nextHistoryLine = numLines; } else Com_Printf( "Couldn't read %s.\n", CONSOLE_HISTORY_FILE ); trap_FS_FCloseFile( f ); }
/* ================== MenuField_Init ================== */ void MenuField_Init( menufield_s* m ) { int l; int w; int h; int style; MField_Clear( &m->field ); if (m->generic.flags & QMF_SMALLFONT) { w = SMALLCHAR_WIDTH; h = SMALLCHAR_HEIGHT; style = UI_SMALLFONT; } else { w = BIGCHAR_WIDTH; h = BIGCHAR_HEIGHT; style = UI_BIGFONT; } l = CG_DrawStrlen( m->generic.name, style ) + w; m->generic.left = m->generic.x - l; m->generic.top = m->generic.y; m->generic.right = m->generic.x + w + m->field.widthInChars*w; m->generic.bottom = m->generic.y + h; }
/* ================ CG_MessageMode4_f ================ */ void CG_MessageMode4_f( void ) { int playerNum = CG_LastAttacker( 0 ); if ( playerNum < 0 || playerNum >= MAX_CLIENTS ) { return; } Com_sprintf( cg.messageCommand, sizeof (cg.messageCommand), "tell %d", playerNum ); Com_sprintf( cg.messagePrompt, sizeof (cg.messagePrompt), "Tell %s:", cgs.playerinfo[ playerNum ].name ); MField_Clear( &cg.messageField ); cg.messageField.widthInChars = 30; Key_SetCatcher( Key_GetCatcher( ) ^ KEYCATCH_MESSAGE ); }
/* ================ CG_ConsoleInit ================ */ void CG_ConsoleInit( void ) { int i; trap_Cvar_VariableStringBuffer( "version", con.version, sizeof ( con.version ) ); con.sideMargin = SMALLCHAR_WIDTH; // fit across whole screen inside of a 640x480 box con.screenFakeWidth = cgs.glconfig.vidWidth / cgs.screenXScale; g_console_field_width = con.screenFakeWidth / SMALLCHAR_WIDTH - 2; MField_Clear( &g_consoleField ); g_consoleField.widthInChars = g_console_field_width; for ( i = 0 ; i < COMMAND_HISTORY ; i++ ) { MField_Clear( &historyEditLines[i] ); historyEditLines[i].widthInChars = g_console_field_width; } CG_LoadConsoleHistory(); }
/* ================ Con_ToggleConsole_f ================ */ void Con_ToggleConsole_f (void) { uiClientState_t cls; trap_GetClientState( &cls ); // Can't toggle the console when it's the only thing available if ( cls.connState == CA_DISCONNECTED && trap_Key_GetCatcher( ) == KEYCATCH_CONSOLE ) { return; } if ( con_autoclear.integer ) { MField_Clear( &g_consoleField ); } g_consoleField.widthInChars = g_console_field_width; trap_Key_SetCatcher( trap_Key_GetCatcher( ) ^ KEYCATCH_CONSOLE ); }
/* ==================== Console_Key Handles history and console scrollback ==================== */ void Console_Key ( int key, qboolean down ) { if ( !down ) { return; } if ( key & K_CHAR_FLAG ) { key &= ~K_CHAR_FLAG; MField_CharEvent( &g_consoleField, key ); return; } // ctrl-L clears screen if ( key == 'l' && trap_Key_IsDown( K_CTRL ) ) { trap_Cmd_ExecuteText( EXEC_APPEND, "clear\n" ); return; } // enter finishes the line if ( key == K_ENTER || key == K_KP_ENTER ) { uiClientState_t cls; trap_GetClientState( &cls ); // if not in the game explicitly prepend a slash if needed if ( cls.connState != CA_ACTIVE && con_autochat.integer && g_consoleField.buffer[0] && g_consoleField.buffer[0] != '\\' && g_consoleField.buffer[0] != '/' ) { char temp[MAX_EDIT_LINE-1]; Q_strncpyz( temp, g_consoleField.buffer, sizeof( temp ) ); Com_sprintf( g_consoleField.buffer, sizeof( g_consoleField.buffer ), "\\%s", temp ); g_consoleField.cursor++; } Com_Printf ( "]%s\n", g_consoleField.buffer ); // leading slash is an explicit command if ( g_consoleField.buffer[0] == '\\' || g_consoleField.buffer[0] == '/' ) { trap_Cmd_ExecuteText( EXEC_APPEND, g_consoleField.buffer+1 ); // valid command trap_Cmd_ExecuteText( EXEC_APPEND, "\n" ); } else { // other text will be chat messages if ( !g_consoleField.buffer[0] ) { return; // empty lines just scroll the console without adding to history } else { if ( con_autochat.integer ) { trap_Cmd_ExecuteText( EXEC_APPEND, "cmd say " ); } trap_Cmd_ExecuteText( EXEC_APPEND, g_consoleField.buffer ); trap_Cmd_ExecuteText( EXEC_APPEND, "\n" ); } } // copy line to history buffer historyEditLines[nextHistoryLine % COMMAND_HISTORY] = g_consoleField; nextHistoryLine++; historyLine = nextHistoryLine; MField_Clear( &g_consoleField ); g_consoleField.widthInChars = g_console_field_width; CG_SaveConsoleHistory( ); if ( cls.connState == CA_DISCONNECTED ) { trap_UpdateScreen(); // force an update, because the command } // may take some time return; } // command completion if (key == K_TAB) { char newbuf[MAX_EDIT_LINE]; trap_Cmd_AutoComplete( g_consoleField.buffer, newbuf, sizeof ( newbuf ) ); if ( strcmp( newbuf, g_consoleField.buffer ) != 0 ) { Q_strncpyz( g_consoleField.buffer, newbuf, sizeof ( g_consoleField.buffer ) ); g_consoleField.cursor = strlen( g_consoleField.buffer ); } return; } // command history (ctrl-p ctrl-n for unix style) if ( ( key == K_MWHEELUP && trap_Key_IsDown( K_SHIFT ) ) || ( key == K_UPARROW ) || ( key == K_KP_UPARROW ) || ( ( tolower(key) == 'p' ) && trap_Key_IsDown( K_CTRL ) ) ) { if ( nextHistoryLine - historyLine < COMMAND_HISTORY && historyLine > 0 ) { historyLine--; } g_consoleField = historyEditLines[ historyLine % COMMAND_HISTORY ]; return; } if ( ( key == K_MWHEELDOWN && trap_Key_IsDown( K_SHIFT ) ) || ( key == K_DOWNARROW ) || ( key == K_KP_DOWNARROW ) || ( ( tolower(key) == 'n' ) && trap_Key_IsDown( K_CTRL ) ) ) { historyLine++; if (historyLine >= nextHistoryLine) { historyLine = nextHistoryLine; MField_Clear( &g_consoleField ); g_consoleField.widthInChars = g_console_field_width; return; } g_consoleField = historyEditLines[ historyLine % COMMAND_HISTORY ]; return; } // console scrolling if ( key == K_PGUP || key == K_KP_PGUP ) { Con_PageUp(); return; } if ( key == K_PGDN || key == K_KP_PGDN ) { Con_PageDown(); return; } if ( key == K_MWHEELUP) { //----(SA) added some mousewheel functionality to the console Con_PageUp(); if ( trap_Key_IsDown( K_CTRL ) ) { // hold <ctrl> to accelerate scrolling Con_PageUp(); Con_PageUp(); } return; } if ( key == K_MWHEELDOWN) { //----(SA) added some mousewheel functionality to the console Con_PageDown(); if ( trap_Key_IsDown( K_CTRL ) ) { // hold <ctrl> to accelerate scrolling Con_PageDown(); Con_PageDown(); } return; } // ctrl-home = top of console if ( ( key == K_HOME || key == K_KP_HOME ) && trap_Key_IsDown( K_CTRL ) ) { Con_Top(); return; } // ctrl-end = bottom of console if ( ( key == K_END || key == K_KP_END ) && trap_Key_IsDown( K_CTRL ) ) { Con_Bottom(); return; } // pass to the normal editline routine MField_KeyDownEvent( &g_consoleField, key ); }
void CG_CloseConsole( void ) { MField_Clear( &g_consoleField ); trap_Key_SetCatcher( trap_Key_GetCatcher( ) & ~KEYCATCH_CONSOLE ); con.finalFrac = 0; // none visible con.displayFrac = 0; }
/* ================== MField_CharEvent ================== */ void MField_CharEvent( mfield_t *edit, int ch ) { int i; if ( ch == 'v' - 'a' + 1 ) { // ctrl-v is paste MField_Paste( edit ); return; } if ( ch == 'c' - 'a' + 1 ) { // ctrl-c clears the field MField_Clear( edit ); return; } if ( ch == 'h' - 'a' + 1 ) { // ctrl-h is backspace if ( edit->cursor > 0 ) { for ( i = edit->cursor; i < edit->len+1; i++ ) { edit->buffer[i-1] = edit->buffer[i]; } edit->cursor--; if ( edit->cursor < edit->scroll ) { edit->scroll--; } edit->len--; } return; } if ( ch == 'a' - 'a' + 1 ) { // ctrl-a is home edit->cursor = 0; edit->scroll = 0; return; } if ( ch == 'e' - 'a' + 1 ) { // ctrl-e is end edit->cursor = edit->len; edit->scroll = edit->cursor - edit->widthInChars + 1; if (edit->scroll < 0) edit->scroll = 0; return; } // // ignore any other non printable chars // if ( ch < 32 ) { return; } if ( trap_Key_GetOverstrikeMode() ) { if ((edit->cursor == MAX_EDIT_LINE - 1) || (edit->maxchars && edit->cursor >= edit->maxchars)) return; } else { // insert mode if (( edit->len == MAX_EDIT_LINE - 1 ) || (edit->maxchars && edit->len >= edit->maxchars)) return; for ( i = edit->len + 1; i >= edit->cursor; i-- ) { edit->buffer[i+1] = edit->buffer[i]; } edit->len++; } edit->buffer[edit->cursor] = ch; if (!edit->maxchars || edit->cursor < edit->maxchars-1) edit->cursor++; if ( edit->cursor >= edit->widthInChars ) { edit->scroll++; } if ( edit->cursor == edit->len + 1) { edit->buffer[edit->cursor] = 0; edit->len++; } }
/* ================ MField_SetText ================ */ void MField_SetText( mfield_t *edit, const char *text ) { MField_Clear( edit ); MField_AddText( edit, text ); }
/* ================== MField_CharEvent ================== */ void MField_CharEvent( mfield_t *edit, int ch ) { int len; if ( ch == 'v' - 'a' + 1 ) { // ctrl-v is paste MField_Paste( edit ); return; } if ( ch == 'c' - 'a' + 1 ) { // ctrl-c clears the field MField_Clear( edit ); return; } len = strlen( edit->buffer ); if ( ch == 'h' - 'a' + 1 ) { // ctrl-h is backspace if ( edit->cursor > 0 ) { memmove( edit->buffer + edit->cursor - 1, edit->buffer + edit->cursor, len + 1 - edit->cursor ); edit->cursor--; if ( edit->cursor < edit->scroll ) { edit->scroll--; } } return; } if ( ch == 'a' - 'a' + 1 ) { // ctrl-a is home edit->cursor = 0; edit->scroll = 0; return; } if ( ch == 'e' - 'a' + 1 ) { // ctrl-e is end edit->cursor = len; edit->scroll = edit->cursor - edit->widthInChars + 1; if (edit->scroll < 0) edit->scroll = 0; return; } // // ignore any other non printable chars // if ( ch < 32 ) { return; } if ( !trap_Key_GetOverstrikeMode() ) { if ((edit->cursor == MAX_EDIT_LINE - 1) || (edit->maxchars && edit->cursor >= edit->maxchars)) return; } else { // insert mode if (( len == MAX_EDIT_LINE - 1 ) || (edit->maxchars && len >= edit->maxchars)) return; memmove( edit->buffer + edit->cursor + 1, edit->buffer + edit->cursor, len + 1 - edit->cursor ); } edit->buffer[edit->cursor] = ch; if (!edit->maxchars || edit->cursor < edit->maxchars-1) edit->cursor++; if ( edit->cursor >= edit->widthInChars ) { edit->scroll++; } if ( edit->cursor == len + 1) { edit->buffer[edit->cursor] = 0; } }