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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user