From 05360ba6b00e39f4ec4399f3007d6ace6b6598d7 Mon Sep 17 00:00:00 2001 From: that Date: Fri, 6 Feb 2015 00:58:16 +0100 Subject: gui: fix console lockup when scrolling Apparently fixing all the signed/unsigned warnings was good. :) Change-Id: I62faa23179e8b2436fe0d24d2152af341cd42fe9 --- gui/console.cpp | 24 ++++++++++++------------ gui/objects.hpp | 10 +++++----- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/gui/console.cpp b/gui/console.cpp index 218a30568..9c780c06b 100644 --- a/gui/console.cpp +++ b/gui/console.cpp @@ -206,7 +206,7 @@ int GUIConsole::RenderConsole(void) gr_fill(mConsoleX + (mConsoleW * 9 / 10), mConsoleY, (mConsoleW / 10), mConsoleH); // Don't try to continue to render without data - int prevCount = mLastCount; + size_t prevCount = mLastCount; mLastCount = gConsole.size(); mRender = false; if (mLastCount == 0) @@ -215,12 +215,11 @@ int GUIConsole::RenderConsole(void) // Due to word wrap, figure out what / how the newly added text needs to be added to the render vector that is word wrapped // Note, that multiple consoles on different GUI pages may be different widths or use different fonts, so the word wrapping // may different in different console windows - for (int i = prevCount; i < mLastCount; i++) { + for (size_t i = prevCount; i < mLastCount; i++) { string curr_line = gConsole[i]; string curr_color = gConsoleColor[i]; - int line_char_width; for(;;) { - line_char_width = gr_maxExW(curr_line.c_str(), fontResource, mConsoleW); + size_t line_char_width = gr_maxExW(curr_line.c_str(), fontResource, mConsoleW); if (line_char_width < curr_line.size()) { rConsole.push_back(curr_line.substr(0, line_char_width)); rConsoleColor.push_back(curr_color); @@ -237,7 +236,7 @@ int GUIConsole::RenderConsole(void) // Find the start point int start; int curLine = mCurrentLine; // Thread-safing (Another thread updates this value) - if (curLine == -1) + if (curLine == -1) // follow tail { start = RenderCount - mMaxRows; } @@ -250,20 +249,21 @@ int GUIConsole::RenderConsole(void) start = curLine - mMaxRows; } - unsigned int line; - for (line = 0; line < mMaxRows; line++) + // note: start can be negative here + for (int line = 0; line < mMaxRows; line++) { - if ((start + (int) line) >= 0 && (start + (int) line) < (int) RenderCount) { - if (rConsoleColor[start + line] == "normal") { + int index = start + line; + if (index >= 0 && index < (int) RenderCount) { + if (rConsoleColor[index] == "normal") { gr_color(mForegroundColor.red, mForegroundColor.green, mForegroundColor.blue, mForegroundColor.alpha); } else { COLOR mFontColor; - std::string color = rConsoleColor[start + line]; + std::string color = rConsoleColor[index]; ConvertStrToColor(color, &mFontColor); mFontColor.alpha = 255; gr_color(mFontColor.red, mFontColor.green, mFontColor.blue, mFontColor.alpha); } - gr_textExW(mConsoleX, mStartY + (line * mFontHeight), rConsole[start + line].c_str(), fontResource, mConsoleW + mConsoleX); + gr_textExW(mConsoleX, mStartY + (line * mFontHeight), rConsole[index].c_str(), fontResource, mConsoleW + mConsoleX); } } return (mSlideout ? RenderSlideout() : 0); @@ -382,7 +382,7 @@ int GUIConsole::NotifyTouch(TOUCH_STATE state, int x, int y) } // If we don't have enough lines to scroll, throw this away. - if (RenderCount < mMaxRows) return 1; + if ((int)RenderCount < mMaxRows) return 1; // We are scrolling!!! switch (state) diff --git a/gui/objects.hpp b/gui/objects.hpp index 0928f3050..c286567f9 100644 --- a/gui/objects.hpp +++ b/gui/objects.hpp @@ -407,11 +407,11 @@ protected: COLOR mForegroundColor; COLOR mBackgroundColor; COLOR mScrollColor; - unsigned int mFontHeight; - int mCurrentLine; - unsigned int mLastCount; - unsigned int RenderCount; - unsigned int mMaxRows; + int mFontHeight; + int mCurrentLine; // index of last line to show; -1 to keep tracking last line + size_t mLastCount; // lines from gConsole that are already split and copied into rConsole + size_t RenderCount; // total number of lines after wrapping + int mMaxRows; // height of console in text rows int mStartY; int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH; int mSlideinX, mSlideinY, mSlideinW, mSlideinH; -- cgit v1.2.3