From 15ef197732d17f167c1a1b41c7e28d65cd4cad30 Mon Sep 17 00:00:00 2001 From: divverent Date: Mon, 3 Aug 2015 16:24:24 +0000 Subject: [PATCH] Color code editing Console edit line: make the color code visible when the cursor is inside it and r_font_disable_freetype is 0 From: terencehill git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@12216 d7cf8633-e32d-0410-b094-e92efae38249 --- console.c | 97 +++++++++++++++++++++++++------------------------------ keys.c | 25 ++------------ 2 files changed, 47 insertions(+), 75 deletions(-) diff --git a/console.c b/console.c index 1f5b30d9..4337a730 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 diff --git a/keys.c b/keys.c index 62db1675..6022f6bb 100644 --- a/keys.c +++ b/keys.c @@ -753,21 +753,6 @@ Key_Console (int key, int unicode) i= MAX_INPUTLINE - key_linepos - 1; if (i > 0) { - // terencehill: insert the clipboard text between the characters of the line - /* - char *temp = (char *) Z_Malloc(MAX_INPUTLINE); - cbd[i]=0; - temp[0]=0; - if ( key_linepos < (int)strlen(key_line) ) - strlcpy(temp, key_line + key_linepos, (int)strlen(key_line) - key_linepos +1); - key_line[key_linepos] = 0; - strlcat(key_line, cbd, sizeof(key_line)); - if (temp[0]) - strlcat(key_line, temp, sizeof(key_line)); - Z_Free(temp); - key_linepos += i; - */ - // blub: I'm changing this to use memmove() like the rest of the code does. cbd[i] = 0; memmove(key_line + key_linepos + i, key_line + key_linepos, sizeof(key_line) - key_linepos - i); memcpy(key_line + key_linepos, cbd, i); @@ -1050,7 +1035,6 @@ Key_Console (int key, int unicode) Key_History_Down(); return; } - // ~1.0795 = 82/76 using con_textsize 64 76 is height of the char, 6 is the distance between 2 lines if (keydown[K_CTRL]) { @@ -1186,24 +1170,21 @@ Key_Console (int key, int unicode) // check insert mode, or always insert if at end of line if (key_insert || len == 0) { + if (key_linepos + len + blen >= MAX_INPUTLINE) + return; // can't use strcpy to move string to right len++; - //memmove(&key_line[key_linepos + u8_bytelen(key_line + key_linepos, 1)], &key_line[key_linepos], len); if (key_linepos + blen + len >= MAX_INPUTLINE) return; memmove(&key_line[key_linepos + blen], &key_line[key_linepos], len); } - // FIXME: This is not proper overwriting with utf8. - if (key_linepos + blen >= MAX_INPUTLINE) + else if (key_linepos + len + blen - u8_bytelen(key_line + key_linepos, 1) >= MAX_INPUTLINE) return; memcpy(key_line + key_linepos, buf, blen); if (blen > len) key_line[key_linepos + blen] = 0; // END OF FIXME key_linepos += blen; - //key_linepos += u8_fromchar(unicode, key_line + key_linepos, sizeof(key_line) - key_linepos - 1); - //key_line[key_linepos] = ascii; - //key_linepos++; } } -- 2.39.2