X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=console.c;h=d443dea45ce8ae3302701e4d78471523310bd33a;hb=ced116bd186ded94c1487b51dad53dc6c313b2c9;hp=7e24b3490ab2ec2d79c153c0087adf60f8c100dc;hpb=cf61d25cac09e3ba0ce9d2a4bc9e97b7d2a631d0;p=xonotic%2Fdarkplaces.git diff --git a/console.c b/console.c index 7e24b349..d443dea4 100644 --- a/console.c +++ b/console.c @@ -19,13 +19,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // console.c -#include "quakedef.h" - #if !defined(WIN32) || defined(__MINGW32__) # include #endif #include +#include "quakedef.h" + // for u8_encodech #include "ft2.h" @@ -93,6 +93,7 @@ lhnetsocket_t *rcon_redirect_sock = NULL; lhnetaddress_t *rcon_redirect_dest = NULL; int rcon_redirect_bufferpos = 0; char rcon_redirect_buffer[1400]; +qboolean rcon_redirect_proquakeprotocol = false; // generic functions for console buffers @@ -125,8 +126,10 @@ ConBuffer_Shutdown void ConBuffer_Shutdown(conbuffer_t *buf) { buf->active = false; - Mem_Free(buf->text); - Mem_Free(buf->lines); + if (buf->text) + Mem_Free(buf->text); + if (buf->lines) + Mem_Free(buf->lines); buf->text = NULL; buf->lines = NULL; } @@ -885,20 +888,38 @@ static char qfont_table[256] = { 'x', 'y', 'z', '{', '|', '}', '~', '<' }; -void Con_Rcon_Redirect_Init(lhnetsocket_t *sock, lhnetaddress_t *dest) +void Con_Rcon_Redirect_Init(lhnetsocket_t *sock, lhnetaddress_t *dest, qboolean proquakeprotocol) { rcon_redirect_sock = sock; rcon_redirect_dest = dest; - memcpy(rcon_redirect_buffer, "\377\377\377\377n", 5); // QW rcon print + rcon_redirect_proquakeprotocol = proquakeprotocol; + if (rcon_redirect_proquakeprotocol) + { + // reserve space for the packet header + rcon_redirect_buffer[0] = 0; + rcon_redirect_buffer[1] = 0; + rcon_redirect_buffer[2] = 0; + rcon_redirect_buffer[3] = 0; + // this is a reply to a CCREQ_RCON + rcon_redirect_buffer[4] = CCREP_RCON; + } + else + memcpy(rcon_redirect_buffer, "\377\377\377\377n", 5); // QW rcon print rcon_redirect_bufferpos = 5; } void Con_Rcon_Redirect_Flush(void) { rcon_redirect_buffer[rcon_redirect_bufferpos] = 0; - NetConn_WriteString(rcon_redirect_sock, rcon_redirect_buffer, rcon_redirect_dest); + if (rcon_redirect_proquakeprotocol) + { + // update the length in the packet header + StoreBigLong((unsigned char *)rcon_redirect_buffer, NETFLAG_CTL | (rcon_redirect_bufferpos & NETFLAG_LENGTH_MASK)); + } + NetConn_Write(rcon_redirect_sock, rcon_redirect_buffer, rcon_redirect_bufferpos, rcon_redirect_dest); memcpy(rcon_redirect_buffer, "\377\377\377\377n", 5); // QW rcon print rcon_redirect_bufferpos = 5; + rcon_redirect_proquakeprotocol = false; } void Con_Rcon_Redirect_End(void) @@ -1029,8 +1050,6 @@ void Con_MaskPrint(int additionalmask, const char *msg) for (;*msg;msg++) { Con_Rcon_AddChar(*msg); - if (index == 0) - mask |= additionalmask; // if this is the beginning of a new line, print timestamp if (index == 0) { @@ -1049,7 +1068,7 @@ void Con_MaskPrint(int additionalmask, const char *msg) { if (con_chatsound.value) { - if(gamemode == GAME_NEXUIZ) + if(gamemode == GAME_NEXUIZ || gamemode == GAME_XONOTIC) { if(msg[1] == '\r' && cl.foundtalk2wav) S_LocalSound ("sound/misc/talk2.wav"); @@ -1075,6 +1094,8 @@ void Con_MaskPrint(int additionalmask, const char *msg) for (;*timestamp;index++, timestamp++) if (index < (int)sizeof(line) - 2) line[index] = *timestamp; + // add the mask + mask |= additionalmask; } // append the character line[index++] = *msg; @@ -1089,16 +1110,29 @@ void Con_MaskPrint(int additionalmask, const char *msg) if (con_initialized && cls.state != ca_dedicated) { Con_PrintToHistory(line, mask); - mask = 0; } // send to terminal or dedicated server window if (!sys_nostdout) + if (developer.integer || !(mask & CON_MASK_DEVELOPER)) { - unsigned char *p; if(sys_specialcharactertranslation.integer) { - for (p = (unsigned char *) line;*p; p++) - *p = qfont_table[*p]; + char *p; + const char *q; + p = line; + while(*p) + { + int ch = u8_getchar(p, &q); + if(ch >= 0xE000 && ch <= 0xE0FF) + { + *p = qfont_table[ch - 0xE000]; + if(q > p+1) + memmove(p+1, q, strlen(q)); + p = p + 1; + } + else + p = p + (q - p); + } } if(sys_colortranslation.integer == 1) // ANSI @@ -1276,6 +1310,7 @@ void Con_MaskPrint(int additionalmask, const char *msg) } // empty the line buffer index = 0; + mask = 0; } } } @@ -1375,12 +1410,15 @@ The input line scrolls horizontally if typing goes beyond the right edge Modified by EvilTypeGuy eviltypeguy@qeradiant.com ================ */ +extern cvar_t r_font_disable_freetype; void Con_DrawInput (void) { int y; int i; char editlinecopy[MAX_INPUTLINE+1], *text; - float x; + float x, xo; + size_t len_out; + int col_out; if (!key_consoleactive) return; // don't draw anything @@ -1400,35 +1438,64 @@ void Con_DrawInput (void) text[i] = 0; // add the cursor frame - if ((int)(realtime*con_cursorspeed) & 1) // cursor is visible + if (r_font_disable_freetype.integer) { - if (!utf8_enable.integer) - text[key_linepos] = 11 + 130 * key_insert; // either solid or triangle facing right - else if (y + 3 < (int)sizeof(editlinecopy)-1) + // this code is freetype incompatible! + if ((int)(realtime*con_cursorspeed) & 1) // cursor is visible { - int ofs = u8_bytelen(text + key_linepos, 1); - size_t len; - const char *curbuf; - curbuf = u8_encodech(0xE000 + 11 + 130 * key_insert, &len); - - if (curbuf) + if (!utf8_enable.integer) + text[key_linepos] = 11 + 130 * key_insert; // either solid or triangle facing right + else if (y + 3 < (int)sizeof(editlinecopy)-1) { - memmove(text + key_linepos + len, text + key_linepos + ofs, sizeof(editlinecopy) - key_linepos - len); - memcpy(text + key_linepos, curbuf, len); - } - } else - text[key_linepos] = '-' + ('+' - '-') * key_insert; + int ofs = u8_bytelen(text + key_linepos, 1); + size_t len; + const char *curbuf; + curbuf = u8_encodech(0xE000 + 11 + 130 * key_insert, &len); + + if (curbuf) + { + memmove(text + key_linepos + len, text + key_linepos + ofs, sizeof(editlinecopy) - key_linepos - len); + memcpy(text + key_linepos, curbuf, len); + } + } else + text[key_linepos] = '-' + ('+' - '-') * key_insert; + } } // text[key_linepos + 1] = 0; - x = vid_conwidth.value * 0.95 - DrawQ_TextWidth(text, key_linepos, con_textsize.value, con_textsize.value, false, FONT_CONSOLE); + len_out = key_linepos; + col_out = -1; + xo = DrawQ_TextWidth_UntilWidth_TrackColors(text, &len_out, con_textsize.value, con_textsize.value, &col_out, false, FONT_CONSOLE, 1000000000); + x = vid_conwidth.value * 0.95 - xo; // scroll if(x >= 0) x = 0; // draw it DrawQ_String(x, con_vislines - con_textsize.value*2, text, y + 3, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, NULL, false, FONT_CONSOLE ); + // add a cursor on top of this (when using freetype) + if (!r_font_disable_freetype.integer) + { + if ((int)(realtime*con_cursorspeed) & 1) // cursor is visible + { + if (!utf8_enable.integer) + { + text[0] = 11 + 130 * key_insert; // either solid or triangle facing right + text[1] = 0; + } + else + { + size_t len; + const char *curbuf; + curbuf = u8_encodech(0xE000 + 11 + 130 * key_insert, &len); + memcpy(text, curbuf, len); + text[len] = 0; + } + DrawQ_String(x + xo, con_vislines - con_textsize.value*2, text, 0, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &col_out, false, FONT_CONSOLE); + } + } + // remove cursor // key_line[key_linepos] = 0; } @@ -1790,6 +1857,8 @@ The typing input line at the bottom should only be drawn if typing is allowed */ void Con_DrawConsole (int lines) { + float alpha, alpha0; + double sx, sy; int mask_must = 0; int mask_mustnot = (developer.integer>0) ? 0 : CON_MASK_DEVELOPER; cachepic_t *conbackpic; @@ -1802,12 +1871,57 @@ void Con_DrawConsole (int lines) con_vislines = lines; + r_draw2d_force = true; + // draw the background - conbackpic = scr_conbrightness.value >= 0.01f ? Draw_CachePic("gfx/conback") : NULL; - if (conbackpic && conbackpic->tex != r_texture_notexture) - DrawQ_Pic(0, lines - vid_conheight.integer, conbackpic, vid_conwidth.integer, vid_conheight.integer, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, cls.signon == SIGNONS ? scr_conalpha.value : 1.0f, 0); // always full alpha when not in game - else - DrawQ_Fill(0, lines - vid_conheight.integer, vid_conwidth.integer, vid_conheight.integer, 0.0f, 0.0f, 0.0f, cls.signon == SIGNONS ? scr_conalpha.value : 1.0f, 0); // always full alpha when not in game + alpha0 = cls.signon == SIGNONS ? scr_conalpha.value : 1.0f; // always full alpha when not in game + if((alpha = alpha0 * scr_conalphafactor.value) > 0) + { + sx = scr_conscroll_x.value; + sy = scr_conscroll_y.value; + conbackpic = scr_conbrightness.value >= 0.01f ? Draw_CachePic_Flags("gfx/conback", (sx != 0 || sy != 0) ? CACHEPICFLAG_NOCLAMP : 0) : NULL; + sx *= realtime; sy *= realtime; + sx -= floor(sx); sy -= floor(sy); + if (conbackpic && conbackpic->tex != r_texture_notexture) + DrawQ_SuperPic(0, lines - vid_conheight.integer, conbackpic, vid_conwidth.integer, vid_conheight.integer, + 0 + sx, 0 + sy, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, alpha, + 1 + sx, 0 + sy, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, alpha, + 0 + sx, 1 + sy, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, alpha, + 1 + sx, 1 + sy, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, alpha, + 0); + else + DrawQ_Fill(0, lines - vid_conheight.integer, vid_conwidth.integer, vid_conheight.integer, 0.0f, 0.0f, 0.0f, alpha, 0); + } + if((alpha = alpha0 * scr_conalpha2factor.value) > 0) + { + sx = scr_conscroll2_x.value; + sy = scr_conscroll2_y.value; + conbackpic = Draw_CachePic_Flags("gfx/conback2", (sx != 0 || sy != 0) ? CACHEPICFLAG_NOCLAMP : 0); + sx *= realtime; sy *= realtime; + sx -= floor(sx); sy -= floor(sy); + if(conbackpic && conbackpic->tex != r_texture_notexture) + DrawQ_SuperPic(0, lines - vid_conheight.integer, conbackpic, vid_conwidth.integer, vid_conheight.integer, + 0 + sx, 0 + sy, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, alpha, + 1 + sx, 0 + sy, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, alpha, + 0 + sx, 1 + sy, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, alpha, + 1 + sx, 1 + sy, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, alpha, + 0); + } + if((alpha = alpha0 * scr_conalpha3factor.value) > 0) + { + sx = scr_conscroll3_x.value; + sy = scr_conscroll3_y.value; + conbackpic = Draw_CachePic_Flags("gfx/conback3", (sx != 0 || sy != 0) ? CACHEPICFLAG_NOCLAMP : 0); + sx *= realtime; sy *= realtime; + sx -= floor(sx); sy -= floor(sy); + if(conbackpic && conbackpic->tex != r_texture_notexture) + DrawQ_SuperPic(0, lines - vid_conheight.integer, conbackpic, vid_conwidth.integer, vid_conheight.integer, + 0 + sx, 0 + sy, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, alpha, + 1 + sx, 0 + sy, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, alpha, + 0 + sx, 1 + sy, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, alpha, + 1 + sx, 1 + sy, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, alpha, + 0); + } DrawQ_String(vid_conwidth.integer - DrawQ_TextWidth(engineversion, 0, con_textsize.value, con_textsize.value, false, FONT_CONSOLE), lines - con_textsize.value, engineversion, 0, con_textsize.value, con_textsize.value, 1, 0, 0, 1, 0, NULL, true, FONT_CONSOLE); // draw the text @@ -1856,6 +1970,8 @@ void Con_DrawConsole (int lines) // draw the input prompt, user text, and cursor if desired Con_DrawInput (); + + r_draw2d_force = false; } /*