diff --git a/src/ct_chat.cpp b/src/ct_chat.cpp index 6628703ab5..6facdde727 100644 --- a/src/ct_chat.cpp +++ b/src/ct_chat.cpp @@ -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(); } //=========================================================================== diff --git a/src/utility/zstring.h b/src/utility/zstring.h index 4c3a3b5413..35e7be7003 100644 --- a/src/utility/zstring.h +++ b/src/utility/zstring.h @@ -131,6 +131,8 @@ public: FString (const char *copyStr); FString (const char *copyStr, size_t copyLen); FString (char oneChar); + FString(const TArray & source) : FString(source.Data(), source.Size()) {} + FString(const TArray & 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);