Fix console recursion bug - Thanks to Oleg Gerasimov
This commit is contained in:
parent
28f4ac22ce
commit
def8fd488f
@ -152,13 +152,60 @@
|
|||||||
#undef gcw
|
#undef gcw
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scroll the history buffer by one line
|
||||||
|
*/
|
||||||
|
static void scrollBuffer(GConsoleObject *gcw) {
|
||||||
|
char *p, *ep;
|
||||||
|
size_t dp;
|
||||||
|
|
||||||
|
// Only scroll if we need to
|
||||||
|
if (!gcw->buffer || (gcw->g.flags & GCONSOLE_FLG_NOSTORE))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// If a buffer overrun has been marked don't scroll as we have already
|
||||||
|
if ((gcw->g.flags & GCONSOLE_FLG_OVERRUN)) {
|
||||||
|
gcw->g.flags &= ~GCONSOLE_FLG_OVERRUN;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove one line from the start
|
||||||
|
ep = gcw->buffer+gcw->bufpos;
|
||||||
|
for(p = gcw->buffer; p < ep && *p != '\n'; p++) {
|
||||||
|
#if GWIN_CONSOLE_ESCSEQ
|
||||||
|
if (*p == 27)
|
||||||
|
ESCtoAttr(p[1], &gcw->startattr);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Was there a newline, if not delete everything.
|
||||||
|
if (*p != '\n') {
|
||||||
|
gcw->bufpos = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete the data
|
||||||
|
dp = ++p - gcw->buffer; // Calculate the amount to to be removed
|
||||||
|
gcw->bufpos -= dp; // Calculate the new size
|
||||||
|
if (gcw->bufpos)
|
||||||
|
memcpy(gcw->buffer, p, gcw->bufpos); // Move the rest of the data
|
||||||
|
}
|
||||||
|
|
||||||
static void HistoryRedraw(GWindowObject *gh) {
|
static void HistoryRedraw(GWindowObject *gh) {
|
||||||
#define gcw ((GConsoleObject *)gh)
|
#define gcw ((GConsoleObject *)gh)
|
||||||
|
coord_t fy;
|
||||||
|
|
||||||
// No redrawing if there is no history
|
// No redrawing if there is no history
|
||||||
if (!gcw->buffer)
|
if (!gcw->buffer)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Handle vertical size decrease - We have to scroll out first lines of the log
|
||||||
|
fy = gdispGetFontMetric(gh->font, fontHeight);
|
||||||
|
while (gcw->cy > gh->height) {
|
||||||
|
scrollBuffer(gcw);
|
||||||
|
gcw->cy -= fy;
|
||||||
|
}
|
||||||
|
|
||||||
// We are printing the buffer - don't store it again
|
// We are printing the buffer - don't store it again
|
||||||
gh->flags |= GCONSOLE_FLG_NOSTORE;
|
gh->flags |= GCONSOLE_FLG_NOSTORE;
|
||||||
|
|
||||||
@ -248,45 +295,6 @@
|
|||||||
gcw->buffer[gcw->bufpos++] = c;
|
gcw->buffer[gcw->bufpos++] = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Scroll the history buffer by one line
|
|
||||||
*/
|
|
||||||
static void scrollBuffer(GConsoleObject *gcw) {
|
|
||||||
char *p, *ep;
|
|
||||||
size_t dp;
|
|
||||||
|
|
||||||
// Only scroll if we need to
|
|
||||||
if (!gcw->buffer || (gcw->g.flags & GCONSOLE_FLG_NOSTORE))
|
|
||||||
return;
|
|
||||||
|
|
||||||
// If a buffer overrun has been marked don't scroll as we have already
|
|
||||||
if ((gcw->g.flags & GCONSOLE_FLG_OVERRUN)) {
|
|
||||||
gcw->g.flags &= ~GCONSOLE_FLG_OVERRUN;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove one line from the start
|
|
||||||
ep = gcw->buffer+gcw->bufpos;
|
|
||||||
for(p = gcw->buffer; p < ep && *p != '\n'; p++) {
|
|
||||||
#if GWIN_CONSOLE_ESCSEQ
|
|
||||||
if (*p == 27)
|
|
||||||
ESCtoAttr(p[1], &gcw->startattr);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Was there a newline, if not delete everything.
|
|
||||||
if (*p != '\n') {
|
|
||||||
gcw->bufpos = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete the data
|
|
||||||
dp = ++p - gcw->buffer; // Calculate the amount to to be removed
|
|
||||||
gcw->bufpos -= dp; // Calculate the new size
|
|
||||||
if (gcw->bufpos)
|
|
||||||
memcpy(gcw->buffer, p, gcw->bufpos); // Move the rest of the data
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear the history buffer
|
* Clear the history buffer
|
||||||
*/
|
*/
|
||||||
@ -532,6 +540,10 @@ void gwinPutChar(GHandle gh, char c) {
|
|||||||
if (gcw->cy + fy > gh->height) {
|
if (gcw->cy + fy > gh->height) {
|
||||||
#if GWIN_CONSOLE_USE_HISTORY && GWIN_CONSOLE_BUFFER_SCROLLING
|
#if GWIN_CONSOLE_USE_HISTORY && GWIN_CONSOLE_BUFFER_SCROLLING
|
||||||
if (gcw->buffer) {
|
if (gcw->buffer) {
|
||||||
|
// If flag GCONSOLE_FLG_NOSTORE is set, then do not recursivly call HistoryRedraw - just drop the buffer
|
||||||
|
if (gh->flags & GCONSOLE_FLG_NOSTORE)
|
||||||
|
gcw->bufpos = 0;
|
||||||
|
|
||||||
// Scroll the buffer and then redraw using the buffer
|
// Scroll the buffer and then redraw using the buffer
|
||||||
scrollBuffer(gcw);
|
scrollBuffer(gcw);
|
||||||
if (DrawStart(gh)) {
|
if (DrawStart(gh)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user