summaryrefslogtreecommitdiffstats
path: root/gui/console.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gui/console.cpp')
-rw-r--r--gui/console.cpp615
1 files changed, 308 insertions, 307 deletions
diff --git a/gui/console.cpp b/gui/console.cpp
index ee3b5e580..517a7c293 100644
--- a/gui/console.cpp
+++ b/gui/console.cpp
@@ -30,373 +30,374 @@ static std::vector<std::string> gConsole;
extern "C" void gui_print(const char *fmt, ...)
{
- char buf[512]; // We're going to limit a single request to 512 bytes
+ char buf[512]; // We're going to limit a single request to 512 bytes
- va_list ap;
- va_start(ap, fmt);
- vsnprintf(buf, 512, fmt, ap);
- va_end(ap);
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(buf, 512, fmt, ap);
+ va_end(ap);
fputs(buf, stdout);
- char *start, *next;
+ char *start, *next;
if (buf[0] == '\n' && strlen(buf) < 2) {
// This prevents the double lines bug seen in the console during zip installs
return;
}
- for (start = next = buf; *next != '\0'; next++)
- {
- if (*next == '\n')
- {
- *next = '\0';
- next++;
+ for (start = next = buf; *next != '\0'; next++)
+ {
+ if (*next == '\n')
+ {
+ *next = '\0';
+ next++;
- std::string line = start;
- gConsole.push_back(line);
- start = next;
+ std::string line = start;
+ gConsole.push_back(line);
+ start = next;
// Handle the normal \n\0 case
- if (*next == '\0')
+ if (*next == '\0')
return;
- }
- }
- std::string line = start;
- gConsole.push_back(line);
- return;
+ }
+ }
+ std::string line = start;
+ gConsole.push_back(line);
+ return;
}
extern "C" void gui_print_overwrite(const char *fmt, ...)
{
- char buf[512]; // We're going to limit a single request to 512 bytes
+ char buf[512]; // We're going to limit a single request to 512 bytes
- va_list ap;
- va_start(ap, fmt);
- vsnprintf(buf, 512, fmt, ap);
- va_end(ap);
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(buf, 512, fmt, ap);
+ va_end(ap);
fputs(buf, stdout);
- // Pop the last line, and we can continue
- if (!gConsole.empty()) gConsole.pop_back();
-
- char *start, *next;
- for (start = next = buf; *next != '\0'; next++)
- {
- if (*next == '\n')
- {
- *next = '\0';
- next++;
-
- std::string line = start;
- gConsole.push_back(line);
- start = next;
-
- // Handle the normal \n\0 case
- if (*next == '\0')
+ // Pop the last line, and we can continue
+ if (!gConsole.empty()) gConsole.pop_back();
+
+ char *start, *next;
+ for (start = next = buf; *next != '\0'; next++)
+ {
+ if (*next == '\n')
+ {
+ *next = '\0';
+ next++;
+
+ std::string line = start;
+ gConsole.push_back(line);
+ start = next;
+
+ // Handle the normal \n\0 case
+ if (*next == '\0')
return;
- }
- }
- std::string line = start;
- gConsole.push_back(line);
- return;
+ }
+ }
+ std::string line = start;
+ gConsole.push_back(line);
+ return;
}
GUIConsole::GUIConsole(xml_node<>* node)
{
- xml_attribute<>* attr;
- xml_node<>* child;
-
- mFont = NULL;
- mCurrentLine = -1;
- memset(&mForegroundColor, 255, sizeof(COLOR));
- memset(&mBackgroundColor, 0, sizeof(COLOR));
- mBackgroundColor.alpha = 255;
- memset(&mScrollColor, 0x08, sizeof(COLOR));
- mScrollColor.alpha = 255;
- mLastCount = 0;
- mSlideout = 0;
- mSlideoutState = hidden;
-
- mRenderX = 0; mRenderY = 0; mRenderW = gr_fb_width(); mRenderH = gr_fb_height();
-
- if (!node)
- {
- mSlideoutX = 0; mSlideoutY = 0; mSlideoutW = 0; mSlideoutH = 0;
- mConsoleX = 0; mConsoleY = 0; mConsoleW = gr_fb_width(); mConsoleH = gr_fb_height();
- }
- else
- {
- child = node->first_node("font");
- if (child)
- {
- attr = child->first_attribute("resource");
- if (attr)
- mFont = PageManager::FindResource(attr->value());
- }
-
- child = node->first_node("color");
- if (child)
- {
- attr = child->first_attribute("foreground");
- if (attr)
- {
- std::string color = attr->value();
- ConvertStrToColor(color, &mForegroundColor);
- }
- attr = child->first_attribute("background");
- if (attr)
- {
- std::string color = attr->value();
- ConvertStrToColor(color, &mBackgroundColor);
- }
- attr = child->first_attribute("scroll");
- if (attr)
- {
- std::string color = attr->value();
- ConvertStrToColor(color, &mScrollColor);
- }
- }
-
- // Load the placement
- LoadPlacement(node->first_node("placement"), &mConsoleX, &mConsoleY, &mConsoleW, &mConsoleH);
-
- child = node->first_node("slideout");
- if (child)
- {
- mSlideout = 1;
- LoadPlacement(child, &mSlideoutX, &mSlideoutY);
-
- attr = child->first_attribute("resource");
- if (attr) mSlideoutImage = PageManager::FindResource(attr->value());
-
- if (mSlideoutImage && mSlideoutImage->GetResource())
- {
- mSlideoutW = gr_get_width(mSlideoutImage->GetResource());
- mSlideoutH = gr_get_height(mSlideoutImage->GetResource());
- }
- }
- }
-
- gr_getFontDetails(mFont, &mFontHeight, NULL);
- SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
- SetRenderPos(mConsoleX, mConsoleY);
- return;
+ xml_attribute<>* attr;
+ xml_node<>* child;
+
+ mFont = NULL;
+ mCurrentLine = -1;
+ memset(&mForegroundColor, 255, sizeof(COLOR));
+ memset(&mBackgroundColor, 0, sizeof(COLOR));
+ mBackgroundColor.alpha = 255;
+ memset(&mScrollColor, 0x08, sizeof(COLOR));
+ mScrollColor.alpha = 255;
+ mLastCount = 0;
+ mSlideout = 0;
+ mSlideoutState = hidden;
+
+ mRenderX = 0; mRenderY = 0; mRenderW = gr_fb_width(); mRenderH = gr_fb_height();
+
+ if (!node)
+ {
+ mSlideoutX = 0; mSlideoutY = 0; mSlideoutW = 0; mSlideoutH = 0;
+ mConsoleX = 0; mConsoleY = 0; mConsoleW = gr_fb_width(); mConsoleH = gr_fb_height();
+ }
+ else
+ {
+ child = node->first_node("font");
+ if (child)
+ {
+ attr = child->first_attribute("resource");
+ if (attr)
+ mFont = PageManager::FindResource(attr->value());
+ }
+
+ child = node->first_node("color");
+ if (child)
+ {
+ attr = child->first_attribute("foreground");
+ if (attr)
+ {
+ std::string color = attr->value();
+ ConvertStrToColor(color, &mForegroundColor);
+ }
+ attr = child->first_attribute("background");
+ if (attr)
+ {
+ std::string color = attr->value();
+ ConvertStrToColor(color, &mBackgroundColor);
+ }
+ attr = child->first_attribute("scroll");
+ if (attr)
+ {
+ std::string color = attr->value();
+ ConvertStrToColor(color, &mScrollColor);
+ }
+ }
+
+ // Load the placement
+ LoadPlacement(node->first_node("placement"), &mConsoleX, &mConsoleY, &mConsoleW, &mConsoleH);
+
+ child = node->first_node("slideout");
+ if (child)
+ {
+ mSlideout = 1;
+ LoadPlacement(child, &mSlideoutX, &mSlideoutY);
+
+ attr = child->first_attribute("resource");
+ if (attr) mSlideoutImage = PageManager::FindResource(attr->value());
+
+ if (mSlideoutImage && mSlideoutImage->GetResource())
+ {
+ mSlideoutW = gr_get_width(mSlideoutImage->GetResource());
+ mSlideoutH = gr_get_height(mSlideoutImage->GetResource());
+ }
+ }
+ }
+
+ gr_getFontDetails(mFont, &mFontHeight, NULL);
+ SetActionPos(mRenderX, mRenderY, mRenderW, mRenderH);
+ SetRenderPos(mConsoleX, mConsoleY);
+ return;
}
int GUIConsole::RenderSlideout(void)
{
- if (!mSlideoutImage || !mSlideoutImage->GetResource()) return -1;
+ if (!mSlideoutImage || !mSlideoutImage->GetResource())
+ return -1;
- gr_blit(mSlideoutImage->GetResource(), 0, 0, mSlideoutW, mSlideoutH, mSlideoutX, mSlideoutY);
- return 0;
+ gr_blit(mSlideoutImage->GetResource(), 0, 0, mSlideoutW, mSlideoutH, mSlideoutX, mSlideoutY);
+ return 0;
}
int GUIConsole::RenderConsole(void)
{
- void* fontResource = NULL;
- if (mFont) fontResource = mFont->GetResource();
-
- // We fill the background
- gr_color(mBackgroundColor.red, mBackgroundColor.green, mBackgroundColor.blue, 255);
- gr_fill(mConsoleX, mConsoleY, mConsoleW, mConsoleH);
-
- gr_color(mScrollColor.red, mScrollColor.green, mScrollColor.blue, mScrollColor.alpha);
- gr_fill(mConsoleX + (mConsoleW * 9 / 10), mConsoleY, (mConsoleW / 10), mConsoleH);
-
- // Render the lines
- gr_color(mForegroundColor.red, mForegroundColor.green, mForegroundColor.blue, mForegroundColor.alpha);
-
- // Don't try to continue to render without data
- mLastCount = gConsole.size();
- if (mLastCount == 0) return (mSlideout ? RenderSlideout() : 0);
-
- // Find the start point
- int start;
- int curLine = mCurrentLine; // Thread-safing (Another thread updates this value)
- if (curLine == -1)
- {
- start = mLastCount - mMaxRows;
- }
- else
- {
- if (curLine > (int) mLastCount) curLine = (int) mLastCount;
- if ((int) mMaxRows > curLine) curLine = (int) mMaxRows;
- start = curLine - mMaxRows;
- }
-
- unsigned int line;
- for (line = 0; line < mMaxRows; line++)
- {
- if ((start + (int) line) >= 0 && (start + (int) line) < (int) mLastCount)
- {
- gr_textExW(mConsoleX, mStartY + (line * mFontHeight), gConsole[start + line].c_str(), fontResource, mConsoleW + mConsoleX);
- }
- }
- return (mSlideout ? RenderSlideout() : 0);
+ void* fontResource = NULL;
+ if (mFont)
+ fontResource = mFont->GetResource();
+
+ // We fill the background
+ gr_color(mBackgroundColor.red, mBackgroundColor.green, mBackgroundColor.blue, 255);
+ gr_fill(mConsoleX, mConsoleY, mConsoleW, mConsoleH);
+
+ gr_color(mScrollColor.red, mScrollColor.green, mScrollColor.blue, mScrollColor.alpha);
+ gr_fill(mConsoleX + (mConsoleW * 9 / 10), mConsoleY, (mConsoleW / 10), mConsoleH);
+
+ // Render the lines
+ gr_color(mForegroundColor.red, mForegroundColor.green, mForegroundColor.blue, mForegroundColor.alpha);
+
+ // Don't try to continue to render without data
+ mLastCount = gConsole.size();
+ if (mLastCount == 0)
+ return (mSlideout ? RenderSlideout() : 0);
+
+ // Find the start point
+ int start;
+ int curLine = mCurrentLine; // Thread-safing (Another thread updates this value)
+ if (curLine == -1)
+ {
+ start = mLastCount - mMaxRows;
+ }
+ else
+ {
+ if (curLine > (int) mLastCount)
+ curLine = (int) mLastCount;
+ if ((int) mMaxRows > curLine)
+ curLine = (int) mMaxRows;
+ start = curLine - mMaxRows;
+ }
+
+ unsigned int line;
+ for (line = 0; line < mMaxRows; line++)
+ {
+ if ((start + (int) line) >= 0 && (start + (int) line) < (int) mLastCount)
+ gr_textExW(mConsoleX, mStartY + (line * mFontHeight), gConsole[start + line].c_str(), fontResource, mConsoleW + mConsoleX);
+ }
+ return (mSlideout ? RenderSlideout() : 0);
}
int GUIConsole::Render(void)
{
- if (mSlideout && mSlideoutState == hidden)
- {
- return RenderSlideout();
- }
- return RenderConsole();
+ if (mSlideout && mSlideoutState == hidden)
+ return RenderSlideout();
+
+ return RenderConsole();
}
int GUIConsole::Update(void)
{
- if (mSlideout && mSlideoutState != visible)
- {
- if (mSlideoutState == hidden)
- return 0;
-
- if (mSlideoutState == request_hide)
- mSlideoutState = hidden;
-
- if (mSlideoutState == request_show)
- mSlideoutState = visible;
-
- // Any time we activate the slider, we reset the position
- mCurrentLine = -1;
- return 2;
- }
-
- if (mCurrentLine == -1 && mLastCount != gConsole.size())
- {
- // We can use Render, and return for just a flip
- Render();
- return 2;
- }
- else if (mLastTouchY >= 0)
- {
- // They're still touching, so re-render
- Render();
- mLastTouchY = -1;
- return 2;
- }
- return 0;
+ if (mSlideout && mSlideoutState != visible)
+ {
+ if (mSlideoutState == hidden)
+ return 0;
+
+ if (mSlideoutState == request_hide)
+ mSlideoutState = hidden;
+
+ if (mSlideoutState == request_show)
+ mSlideoutState = visible;
+
+ // Any time we activate the slider, we reset the position
+ mCurrentLine = -1;
+ return 2;
+ }
+
+ if (mCurrentLine == -1 && mLastCount != gConsole.size())
+ {
+ // We can use Render, and return for just a flip
+ Render();
+ return 2;
+ }
+ else if (mLastTouchY >= 0)
+ {
+ // They're still touching, so re-render
+ Render();
+ mLastTouchY = -1;
+ return 2;
+ }
+ return 0;
}
int GUIConsole::SetRenderPos(int x, int y, int w, int h)
{
- // Adjust the stub position accordingly
- mSlideoutX += (x - mConsoleX);
- mSlideoutY += (y - mConsoleY);
-
- mConsoleX = x;
- mConsoleY = y;
- if (w || h)
- {
- mConsoleW = w;
- mConsoleH = h;
- }
-
- // Calculate the max rows
- mMaxRows = mConsoleH / mFontHeight;
-
- // Adjust so we always fit to bottom
- mStartY = mConsoleY + (mConsoleH % mFontHeight);
- return 0;
+ // Adjust the stub position accordingly
+ mSlideoutX += (x - mConsoleX);
+ mSlideoutY += (y - mConsoleY);
+
+ mConsoleX = x;
+ mConsoleY = y;
+ if (w || h)
+ {
+ mConsoleW = w;
+ mConsoleH = h;
+ }
+
+ // Calculate the max rows
+ mMaxRows = mConsoleH / mFontHeight;
+
+ // Adjust so we always fit to bottom
+ mStartY = mConsoleY + (mConsoleH % mFontHeight);
+ return 0;
}
// IsInRegion - Checks if the request is handled by this object
// Return 0 if this object handles the request, 1 if not
int GUIConsole::IsInRegion(int x, int y)
{
- if (mSlideout)
- {
- // Check if they tapped the slideout button
- if (x >= mSlideoutX && x <= mSlideoutX + mSlideoutW && y >= mSlideoutY && y < mSlideoutY + mSlideoutH)
- return 1;
-
- // If we're only rendering the slideout, bail now
- if (mSlideoutState == hidden)
- return 0;
- }
-
- return (x < mConsoleX || x > mConsoleX + mConsoleW || y < mConsoleY || y > mConsoleY + mConsoleH) ? 0 : 1;
+ if (mSlideout)
+ {
+ // Check if they tapped the slideout button
+ if (x >= mSlideoutX && x <= mSlideoutX + mSlideoutW && y >= mSlideoutY && y < mSlideoutY + mSlideoutH)
+ return 1;
+
+ // If we're only rendering the slideout, bail now
+ if (mSlideoutState == hidden)
+ return 0;
+ }
+
+ return (x < mConsoleX || x > mConsoleX + mConsoleW || y < mConsoleY || y > mConsoleY + mConsoleH) ? 0 : 1;
}
// NotifyTouch - Notify of a touch event
// Return 0 on success, >0 to ignore remainder of touch, and <0 on error
int GUIConsole::NotifyTouch(TOUCH_STATE state, int x, int y)
{
- if (mSlideout && mSlideoutState == hidden)
- {
- if (state == TOUCH_START)
- {
- mSlideoutState = request_show;
- return 1;
- }
- }
- else if (mSlideout && mSlideoutState == visible)
- {
- // Are we sliding it back in?
- if (state == TOUCH_START && x > mSlideoutX && x < (mSlideoutX + mSlideoutW) && y > mSlideoutY && y < (mSlideoutY + mSlideoutH))
- {
- mSlideoutState = request_hide;
- return 1;
- }
- }
-
- // If we don't have enough lines to scroll, throw this away.
- if (mLastCount < mMaxRows) return 1;
-
- // We are scrolling!!!
- switch (state)
- {
- case TOUCH_START:
- mLastTouchX = x;
- mLastTouchY = y;
- if ((x - mConsoleX) > ((9 * mConsoleW) / 10))
- mSlideMultiplier = 10;
- else
- mSlideMultiplier = 1;
- break;
-
- case TOUCH_DRAG:
- // This handles tapping
- if (x == mLastTouchX && y == mLastTouchY) break;
- mLastTouchX = -1;
-
- if (y > mLastTouchY + 5)
- {
- mLastTouchY = y;
- if (mCurrentLine == -1)
- mCurrentLine = mLastCount - 1;
- else if (mCurrentLine > mSlideMultiplier)
- mCurrentLine -= mSlideMultiplier;
- else
- mCurrentLine = mMaxRows;
-
- if (mCurrentLine < (int) mMaxRows)
- mCurrentLine = mMaxRows;
- }
- else if (y < mLastTouchY - 5)
- {
- mLastTouchY = y;
- if (mCurrentLine >= 0)
- {
- mCurrentLine += mSlideMultiplier;
- if (mCurrentLine >= (int) mLastCount)
- mCurrentLine = -1;
- }
- }
- break;
-
- case TOUCH_RELEASE:
- // On a tap, we jump to the tail
- if (mLastTouchX >= 0)
- mCurrentLine = -1;
-
- mLastTouchY = -1;
+ if (mSlideout && mSlideoutState == hidden)
+ {
+ if (state == TOUCH_START)
+ {
+ mSlideoutState = request_show;
+ return 1;
+ }
+ }
+ else if (mSlideout && mSlideoutState == visible)
+ {
+ // Are we sliding it back in?
+ if (state == TOUCH_START && x > mSlideoutX && x < (mSlideoutX + mSlideoutW) && y > mSlideoutY && y < (mSlideoutY + mSlideoutH))
+ {
+ mSlideoutState = request_hide;
+ return 1;
+ }
+ }
+
+ // If we don't have enough lines to scroll, throw this away.
+ if (mLastCount < mMaxRows) return 1;
+
+ // We are scrolling!!!
+ switch (state)
+ {
+ case TOUCH_START:
+ mLastTouchX = x;
+ mLastTouchY = y;
+ if ((x - mConsoleX) > ((9 * mConsoleW) / 10))
+ mSlideMultiplier = 10;
+ else
+ mSlideMultiplier = 1;
+ break;
+
+ case TOUCH_DRAG:
+ // This handles tapping
+ if (x == mLastTouchX && y == mLastTouchY) break;
+ mLastTouchX = -1;
+
+ if (y > mLastTouchY + 5)
+ {
+ mLastTouchY = y;
+ if (mCurrentLine == -1)
+ mCurrentLine = mLastCount - 1;
+ else if (mCurrentLine > mSlideMultiplier)
+ mCurrentLine -= mSlideMultiplier;
+ else
+ mCurrentLine = mMaxRows;
+
+ if (mCurrentLine < (int) mMaxRows)
+ mCurrentLine = mMaxRows;
+ }
+ else if (y < mLastTouchY - 5)
+ {
+ mLastTouchY = y;
+ if (mCurrentLine >= 0)
+ {
+ mCurrentLine += mSlideMultiplier;
+ if (mCurrentLine >= (int) mLastCount)
+ mCurrentLine = -1;
+ }
+ }
+ break;
+
+ case TOUCH_RELEASE:
+ // On a tap, we jump to the tail
+ if (mLastTouchX >= 0)
+ mCurrentLine = -1;
+
+ mLastTouchY = -1;
case TOUCH_REPEAT:
case TOUCH_HOLD:
- break;
- }
- return 0;
+ break;
+ }
+ return 0;
}
-