From 1f877dbca1ed0e92b61ef7a84b7eb5980f18e812 Mon Sep 17 00:00:00 2001 From: Bart House Date: Sun, 13 May 2018 20:46:43 -0700 Subject: [PATCH] Additional changes to xputc_core() and early_raw_print() to manage the cursor position correctly. This is needed to handle raw printing correctly. Added check for when we might be running off the bottom of the screen when handling msmsg(). Added runtime checks to keep cursor always within bounds. --- sys/winnt/nttty.c | 117 ++++++++++++++++++++++++++++++---------------- 1 file changed, 78 insertions(+), 39 deletions(-) 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);