From 843b490b155eb2e531359910b1d4861f83d69109 Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Fri, 17 Jul 2015 19:21:51 +0100 Subject: winansi: fixes to cursor positioning, screen clearing It seems that the cursor positioning escape sequence 'ESC[n;mH' allows n and m values of 0 or 1 to represent the leftmost/topmost position. Allow for this and also fix handling of missing values. When the screen is cleared using FillConsoleOutputCharacterA it's also necessary to make explicit calls to FillConsoleOutputAttribute to reset attributes. --- win32/winansi.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'win32') diff --git a/win32/winansi.c b/win32/winansi.c index c47e29a28..0a637670c 100644 --- a/win32/winansi.c +++ b/win32/winansi.c @@ -101,6 +101,9 @@ static void erase_in_line(void) FillConsoleOutputCharacterA(console, ' ', sbi.dwSize.X - sbi.dwCursorPosition.X, sbi.dwCursorPosition, &dummy); + FillConsoleOutputAttribute(console, plain_attr, + sbi.dwSize.X - sbi.dwCursorPosition.X, sbi.dwCursorPosition, + &dummy); } static void erase_till_end_of_screen(void) @@ -116,11 +119,17 @@ static void erase_till_end_of_screen(void) FillConsoleOutputCharacterA(console, ' ', sbi.dwSize.X - sbi.dwCursorPosition.X, sbi.dwCursorPosition, &dummy); + FillConsoleOutputAttribute(console, plain_attr, + sbi.dwSize.X - sbi.dwCursorPosition.X, sbi.dwCursorPosition, + &dummy); pos.X = 0; - for (pos.Y = sbi.dwCursorPosition.Y+1; pos.Y < sbi.dwSize.Y; pos.Y++) + for (pos.Y = sbi.dwCursorPosition.Y+1; pos.Y < sbi.dwSize.Y; pos.Y++) { FillConsoleOutputCharacterA(console, ' ', sbi.dwSize.X, pos, &dummy); + FillConsoleOutputAttribute(console, plain_attr, sbi.dwSize.X, + pos, &dummy); + } } static void move_cursor_row(int n) @@ -313,11 +322,13 @@ static const char *set_attr(const char *str) if (!len) move_cursor(0, 0); else { - int row = strtol(str, (char **)&str, 10); + int row, col = 1; + + row = strtol(str, (char **)&str, 10); if (*str == ';') { - int col = strtol(str+1, (char **)&str, 10); - move_cursor(col-1, row-1); + col = strtol(str+1, (char **)&str, 10); } + move_cursor(col > 0 ? col-1 : 0, row > 0 ? row-1 : 0); } break; case 'J': -- cgit v1.2.3-55-g6feb