diff --git a/sys/winnt/nttty.c b/sys/winnt/nttty.c index 61bd36f40..6dfb77471 100644 --- a/sys/winnt/nttty.c +++ b/sys/winnt/nttty.c @@ -458,6 +458,15 @@ int *x, *y, *mod; return ch; } +static void set_console_cursor(int x, int y) +{ + ntassert(x >= 0 && x < console.width); + ntassert(y >= 0 && y < console.height); + + console.cursor.X = max(0, min(console.width - 1, x)); + console.cursor.Y = max(0, min(console.height - 1, y)); +} + static void really_move_cursor() { @@ -474,10 +483,9 @@ really_move_cursor() (void) SetConsoleTitle(newtitle); } #endif - if (ttyDisplay) { - console.cursor.X = ttyDisplay->curx; - console.cursor.Y = ttyDisplay->cury; - } + if (ttyDisplay) + set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); + back_buffer_flip(); SetConsoleCursorPosition(console.hConOut, console.cursor); } @@ -488,26 +496,25 @@ register int x, y; { ttyDisplay->cury = y; ttyDisplay->curx = x; - console.cursor.X = x; - console.cursor.Y = y; + + set_console_cursor(x, y); } void nocmov(x, y) int x, y; { - console.cursor.X = x; - console.cursor.Y = y; ttyDisplay->curx = x; ttyDisplay->cury = y; + + set_console_cursor(x, y); } void xputc(ch) char ch; { - console.cursor.X = ttyDisplay->curx; - console.cursor.Y = ttyDisplay->cury; + set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); xputc_core(ch); } @@ -518,10 +525,8 @@ const char *s; int k; int slen = strlen(s); - if (ttyDisplay) { - console.cursor.X = ttyDisplay->curx; - console.cursor.Y = ttyDisplay->cury; - } + if (ttyDisplay) + set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); if (s) { for (k = 0; k < slen && s[k]; ++k) @@ -537,6 +542,9 @@ void xputc_core(ch) char ch; { + ntassert(console.cursor.X >= 0 && console.cursor.X < console.width); + ntassert(console.cursor.Y >= 0 && console.cursor.Y < console.height); + boolean inverse = FALSE; cell_t cell; @@ -549,7 +557,12 @@ char ch; console.cursor.X = 1; break; case '\b': - console.cursor.X--; + if (console.cursor.X > 1) { + console.cursor.X--; + } else if(console.cursor.Y > 0) { + console.cursor.X = console.width - 1; + console.cursor.Y--; + } break; default: inverse = (console.current_nhattr[ATR_INVERSE] && iflags.wc_inverse); @@ -565,14 +578,18 @@ char ch; buffer_write(console.back_buffer, &cell, console.cursor); - console.cursor.X++; - - if (console.cursor.X == console.width) { - console.cursor.X = 0; - if (console.cursor.Y < console.height - 1) + if (console.cursor.X == console.width - 1) { + if (console.cursor.Y < console.height - 1) { + console.cursor.X = 1; console.cursor.Y++; + } + } else { + console.cursor.X++; } } + + ntassert(console.cursor.X >= 0 && console.cursor.X < console.width); + ntassert(console.cursor.Y >= 0 && console.cursor.Y < console.height); } /* @@ -623,8 +640,7 @@ int in_ch; boolean inverse = FALSE; unsigned char ch = (unsigned char) in_ch; - console.cursor.X = ttyDisplay->curx; - console.cursor.Y = ttyDisplay->cury; + set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); inverse = (console.current_nhattr[ATR_INVERSE] && iflags.wc_inverse); console.attr = (console.current_nhattr[ATR_INVERSE] && iflags.wc_inverse) ? @@ -644,8 +660,7 @@ int in_ch; void cl_end() { - console.cursor.X = ttyDisplay->curx; - console.cursor.Y = ttyDisplay->cury; + set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); buffer_clear_to_end_of_line(console.back_buffer, console.cursor.X, console.cursor.Y); tty_curs(BASE_WINDOW, (int) ttyDisplay->curx + 1, (int) ttyDisplay->cury); @@ -667,15 +682,14 @@ clear_screen() void home() { - console.cursor.X = console.cursor.Y = 0; ttyDisplay->curx = ttyDisplay->cury = 0; + set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); } void backsp() { - console.cursor.X = ttyDisplay->curx; - console.cursor.Y = ttyDisplay->cury; + set_console_cursor(ttyDisplay->curx, ttyDisplay->cury); xputc_core('\b'); } @@ -1082,6 +1096,17 @@ VA_DECL(const char *, fmt) if(!init_ttycolor_completed) init_ttycolor(); + /* if we have generated too many messages ... ask the user to + * confirm and then clear. + */ + if (console.cursor.Y > console.height - 4) { + xputs("Hit to continue."); + while (pgetchar() != '\n') + ; + raw_clear_screen(); + set_console_cursor(1, 0); + } + xputs(buf); if (ttyDisplay) curs(BASE_WINDOW, console.cursor.X + 1, console.cursor.Y); @@ -1714,35 +1739,49 @@ void early_raw_print(const char *s) if (console.hConOut == NULL) return; + ntassert(console.cursor.X >= 0 && console.cursor.X < console.width); + ntassert(console.cursor.Y >= 0 && console.cursor.Y < console.height); + WORD attribute = FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE; DWORD unused; while (*s != '\0') { switch (*s) { case '\n': - console.cursor.Y++; + if (console.cursor.Y < console.height - 1) + console.cursor.Y++; /* fall through */ case '\r': - console.cursor.X = 0; + console.cursor.X = 1; break; case '\b': - console.cursor.X--; + if (console.cursor.X > 1) { + console.cursor.X--; + } else if(console.cursor.Y > 0) { + console.cursor.X = console.width - 1; + console.cursor.Y--; + } break; default: WriteConsoleOutputAttribute(console.hConOut, &attribute, 1, console.cursor, &unused); WriteConsoleOutputCharacterA(console.hConOut, s, 1, console.cursor, &unused); - console.cursor.X++; - - if (console.cursor.X == console.width) { - console.cursor.Y++; - console.cursor.X = 0; + if (console.cursor.X == console.width - 1) { + if (console.cursor.Y < console.height - 1) { + console.cursor.X = 1; + console.cursor.Y++; + } + } else { + console.cursor.X++; } } s++; } + ntassert(console.cursor.X >= 0 && console.cursor.X < console.width); + ntassert(console.cursor.Y >= 0 && console.cursor.Y < console.height); + SetConsoleCursorPosition(console.hConOut, console.cursor); } @@ -1776,9 +1815,6 @@ void nethack_enter_nttty() /* set up state needed by early_raw_print() */ windowprocs.win_raw_print = early_raw_print; - console.cursor.X = 0; - console.cursor.Y = 0; - console.hConOut = GetStdHandle(STD_OUTPUT_HANDLE); ntassert(console.hConOut != NULL); // NOTE: this assert will not print @@ -1802,9 +1838,11 @@ void nethack_enter_nttty() console.buffer_size = console.width * console.height; + /* clear the entire console buffer */ int size = console.origcsbi.dwSize.X * console.origcsbi.dwSize.Y; DWORD unused; + set_console_cursor(0, 0); FillConsoleOutputAttribute( console.hConOut, CONSOLE_CLEAR_ATTRIBUTE, size, console.cursor, &unused); @@ -1813,9 +1851,10 @@ void nethack_enter_nttty() console.hConOut, CONSOLE_CLEAR_CHARACTER, size, console.cursor, &unused); + set_console_cursor(1, 0); SetConsoleCursorPosition(console.hConOut, console.cursor); - /* At this point early_raw_print will output */ + /* At this point early_raw_print will work */ console.hConIn = GetStdHandle(STD_INPUT_HANDLE); ntassert(console.hConIn != NULL);