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.
This commit is contained in:
Bart House
2018-05-13 20:46:43 -07:00
parent 53c7cb8c78
commit 1f877dbca1

View File

@@ -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 <Enter> 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);