X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=console.c;h=51a1a1233d3bf1d4ec96027bcec445309a86548c;hb=d4cd2cda4a1eb2288f2acc600b823c02715d1e12;hp=8dde83d90ce267a684ea69eb723a04d6d28176ee;hpb=d090340b054029faddb432e2c66085e6e91abcf7;p=xonotic%2Fdarkplaces.git diff --git a/console.c b/console.c index 8dde83d9..51a1a123 100644 --- a/console.c +++ b/console.c @@ -1506,12 +1506,11 @@ 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; static void Con_DrawInput (void) { int y; int i; - char editlinecopy[MAX_INPUTLINE+1], *text; + char text[sizeof(key_line)+5+1]; // space for ^^xRGB too float x, xo; size_t len_out; int col_out; @@ -1519,48 +1518,46 @@ static void Con_DrawInput (void) if (!key_consoleactive) return; // don't draw anything - strlcpy(editlinecopy, key_line, sizeof(editlinecopy)); - text = editlinecopy; + strlcpy(text, key_line, sizeof(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 y = (int)strlen(text); - // append enoug nul-bytes to cover the utf8-versions of the cursor too - for (i = y; i < y + 4 && i < (int)sizeof(editlinecopy); ++i) - text[i] = 0; - - // add the cursor frame - if (r_font_disable_freetype.integer) + // make the color code visible when the cursor is inside it + if(text[key_linepos] != 0) { - // this code is freetype incompatible! - if ((int)(realtime*con_cursorspeed) & 1) // cursor is visible - { - 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) + for(i=1; i < 5 && key_linepos - i > 0; ++i) + if(text[key_linepos-i] == STRING_COLOR_TAG) { - int ofs = (int)u8_bytelen(text + key_linepos, 1); - size_t len; - const char *curbuf; - char charbuf16[16]; - curbuf = u8_encodech(0xE000 + 11 + 130 * key_insert, &len, charbuf16); - - if (curbuf) + int caret_pos, ofs = 0; + caret_pos = key_linepos - i; + if(i == 1 && text[caret_pos+1] == STRING_COLOR_TAG) + ofs = 1; + else if(i == 1 && isdigit(text[caret_pos+1])) + ofs = 2; + else if(text[caret_pos+1] == STRING_COLOR_RGB_TAG_CHAR && isxdigit(text[caret_pos+2]) && isxdigit(text[caret_pos+3]) && isxdigit(text[caret_pos+4])) + ofs = 5; + if(ofs && (size_t)(y + ofs + 1) < sizeof(text)) { - memmove(text + key_linepos + len, text + key_linepos + ofs, sizeof(editlinecopy) - key_linepos - len); - memcpy(text + key_linepos, curbuf, len); + int carets = 1; + while(caret_pos - carets >= 1 && text[caret_pos - carets] == STRING_COLOR_TAG) + ++carets; + if(carets & 1) + { + // str^2ing (displayed as string) --> str^2^^2ing (displayed as str^2ing) + // str^^ing (displayed as str^ing) --> str^^^^ing (displayed as str^^ing) + memmove(&text[caret_pos + ofs + 1], &text[caret_pos], y - caret_pos); + text[caret_pos + ofs] = STRING_COLOR_TAG; + y += ofs + 1; + text[y] = 0; + } } - } else - text[key_linepos] = '-' + ('+' - '-') * key_insert; - } + break; + } } -// text[key_linepos + 1] = 0; - 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); @@ -1571,31 +1568,25 @@ static void Con_DrawInput (void) // 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) + // draw a cursor on top of this + if ((int)(realtime*con_cursorspeed) & 1) // cursor is visible { - if ((int)(realtime*con_cursorspeed) & 1) // cursor is visible + if (!utf8_enable.integer) { - 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; - char charbuf16[16]; - curbuf = u8_encodech(0xE000 + 11 + 130 * key_insert, &len, charbuf16); - 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); + text[0] = 11 + 130 * key_insert; // either solid or triangle facing right + text[1] = 0; } + else + { + size_t len; + const char *curbuf; + char charbuf16[16]; + curbuf = u8_encodech(0xE000 + 11 + 130 * key_insert, &len, charbuf16); + 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; } typedef struct @@ -1673,7 +1664,7 @@ static int Con_DrawNotifyRect(int mask_must, int mask_mustnot, float maxage, flo int startidx; int nskip = 0; int continuationWidth = 0; - size_t l; + size_t len; double t = cl.time; // saved so it won't change con_text_info_t ti; @@ -1685,10 +1676,10 @@ static int Con_DrawNotifyRect(int mask_must, int mask_mustnot, float maxage, flo ti.ymax = y + height; ti.continuationString = continuationString; - l = 0; - Con_WordWidthFunc(&ti, NULL, &l, -1); - l = strlen(continuationString); - continuationWidth = (int) Con_WordWidthFunc(&ti, continuationString, &l, -1); + len = 0; + Con_WordWidthFunc(&ti, NULL, &len, -1); + len = strlen(continuationString); + continuationWidth = (int) Con_WordWidthFunc(&ti, continuationString, &len, -1); // first find the first line to draw by backwards iterating and word wrapping to find their length... startidx = CON_LINES_COUNT; @@ -1823,7 +1814,7 @@ void Con_DrawNotify (void) if(numChatlines) { - Con_DrawNotifyRect(CON_MASK_CHAT, CON_MASK_INPUT, con_chattime.value, x, v, vid_conwidth.value * con_chatwidth.value, height, con_chatsize.value, 0.0, 1.0, (utf8_enable.integer ? "^3\xee\x80\x8c\xee\x80\x8c\xee\x80\x8c " : "^3\014\014\014 ")); // 015 is ·> character in conchars.tga + Con_DrawNotifyRect(CON_MASK_CHAT, CON_MASK_INPUT, con_chattime.value, x, v, vid_conwidth.value * con_chatwidth.value, height, con_chatsize.value, 0.0, 1.0, "^3 ... "); v += height; } if (key_dest == key_message) @@ -1865,7 +1856,6 @@ static int Con_LineHeight(int lineno) { float width = vid_conwidth.value; con_text_info_t ti; - con_lineinfo_t *li = &CON_LINES(lineno); ti.fontsize = con_textsize.value; ti.font = FONT_CONSOLE; li->height = COM_Wordwrap(li->start, li->len, 0, width, Con_WordWidthFunc, &ti, Con_CountLineFunc, NULL);