- fixed chat input.

This commit is contained in:
Christoph Oelckers 2019-02-23 09:54:18 +01:00
parent a50a0c5b0d
commit add10029b9
2 changed files with 13 additions and 18 deletions

View file

@ -112,7 +112,6 @@ CVAR (Bool, chat_substitution, false, CVAR_ARCHIVE)
void CT_Init ()
{
ChatQueue.Clear();
ChatQueue.Push(0);
CharLen = 0;
chatmodeon = 0;
}
@ -142,7 +141,9 @@ bool CT_Responder (event_t *ev)
{
if (ev->data1 == '\r')
{
ChatQueue.Push(0);
ShoveChatStr ((char *)ChatQueue.Data(), chatmodeon - 1);
ChatQueue.Pop();
CT_Stop ();
return true;
}
@ -162,7 +163,9 @@ bool CT_Responder (event_t *ev)
else if (ev->data1 == 'C' && (ev->data3 & GKM_CTRL))
#endif // __APPLE__
{
ChatQueue.Push(0);
I_PutInClipboard ((char *)ChatQueue.Data());
ChatQueue.Pop();
return true;
}
#ifdef __APPLE__
@ -249,25 +252,22 @@ void CT_Drawer (void)
promptwidth = displayfont->StringWidth (prompt) * scalex;
x = displayfont->GetCharWidth (displayfont->GetCursor()) * scalex * 2 + promptwidth;
FString printstr = ChatQueue;
// figure out if the text is wider than the screen
// if so, only draw the right-most portion of it.
const uint8_t *textp = ChatQueue.Data();
const uint8_t *textp = (const uint8_t*)printstr.GetChars();
while(*textp)
{
auto textw = displayfont->StringWidth(textp);
if (x + textw * scalex < screen_width) break;
GetCharFromString(textp);
}
printstr += displayfont->GetCursor();
// draw the prompt, text, and cursor
ChatQueue.Last() = displayfont->GetCursor();
ChatQueue.Push(0);
screen->DrawText (displayfont, CR_GREEN, 0, y, prompt,
DTA_VirtualWidth, screen_width, DTA_VirtualHeight, screen_height, DTA_KeepRatio, true, TAG_DONE);
screen->DrawText (displayfont, CR_GREY, promptwidth, y, (const char *)textp,
screen->DrawText (displayfont, CR_GREY, promptwidth, y, printstr,
DTA_VirtualWidth, screen_width, DTA_VirtualHeight, screen_height, DTA_KeepRatio, true, TAG_DONE);
ChatQueue.Pop();
ChatQueue.Last() = 0;
}
if (players[consoleplayer].camera != NULL &&
@ -301,7 +301,6 @@ static void CT_AddChar (int c)
}
CharLen++;
}
ChatQueue.Push(0);
}
}
@ -316,10 +315,9 @@ static void CT_BackSpace ()
{
if (CharLen)
{
int endpos = ChatQueue.Size() - 2;
int endpos = ChatQueue.Size() - 1;
while (endpos > 0 && ChatQueue[endpos] >= 0x80 && ChatQueue[endpos] < 0xc0) endpos--;
ChatQueue[endpos] = 0;
ChatQueue.Clamp(endpos + 1);
ChatQueue.Clamp(endpos);
CharLen--;
}
}
@ -333,12 +331,7 @@ static void CT_BackSpace ()
static void CT_ClearChatMessage ()
{
if (ChatQueue.Size() > 1)
{
ChatQueue.Clamp(1);
ChatQueue[0] = 0;
CharLen = 0;
}
ChatQueue.Clear();
}
//===========================================================================

View file

@ -131,6 +131,8 @@ public:
FString (const char *copyStr);
FString (const char *copyStr, size_t copyLen);
FString (char oneChar);
FString(const TArray<char> & source) : FString(source.Data(), source.Size()) {}
FString(const TArray<uint8_t> & source) : FString((char*)source.Data(), source.Size()) {}
// This is intentionally #ifdef'd. The only code which needs this is parts of the Windows backend that receive Unicode text from the system.
#ifdef _WIN32
explicit FString(const wchar_t *copyStr);