diff options
author | Ron Yorston <rmy@pobox.com> | 2015-07-17 19:21:51 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2015-07-17 19:21:51 +0100 |
commit | 843b490b155eb2e531359910b1d4861f83d69109 (patch) | |
tree | 0aa07e92c92fe7f8e5126a3544d40ded67678b5d | |
parent | 9fe16f6102d8ab907c056c484988057904092c06 (diff) | |
download | busybox-w32-843b490b155eb2e531359910b1d4861f83d69109.tar.gz busybox-w32-843b490b155eb2e531359910b1d4861f83d69109.tar.bz2 busybox-w32-843b490b155eb2e531359910b1d4861f83d69109.zip |
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.
-rw-r--r-- | win32/winansi.c | 19 |
1 files changed, 15 insertions, 4 deletions
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) | |||
101 | FillConsoleOutputCharacterA(console, ' ', | 101 | FillConsoleOutputCharacterA(console, ' ', |
102 | sbi.dwSize.X - sbi.dwCursorPosition.X, sbi.dwCursorPosition, | 102 | sbi.dwSize.X - sbi.dwCursorPosition.X, sbi.dwCursorPosition, |
103 | &dummy); | 103 | &dummy); |
104 | FillConsoleOutputAttribute(console, plain_attr, | ||
105 | sbi.dwSize.X - sbi.dwCursorPosition.X, sbi.dwCursorPosition, | ||
106 | &dummy); | ||
104 | } | 107 | } |
105 | 108 | ||
106 | static void erase_till_end_of_screen(void) | 109 | static void erase_till_end_of_screen(void) |
@@ -116,11 +119,17 @@ static void erase_till_end_of_screen(void) | |||
116 | FillConsoleOutputCharacterA(console, ' ', | 119 | FillConsoleOutputCharacterA(console, ' ', |
117 | sbi.dwSize.X - sbi.dwCursorPosition.X, sbi.dwCursorPosition, | 120 | sbi.dwSize.X - sbi.dwCursorPosition.X, sbi.dwCursorPosition, |
118 | &dummy); | 121 | &dummy); |
122 | FillConsoleOutputAttribute(console, plain_attr, | ||
123 | sbi.dwSize.X - sbi.dwCursorPosition.X, sbi.dwCursorPosition, | ||
124 | &dummy); | ||
119 | 125 | ||
120 | pos.X = 0; | 126 | pos.X = 0; |
121 | for (pos.Y = sbi.dwCursorPosition.Y+1; pos.Y < sbi.dwSize.Y; pos.Y++) | 127 | for (pos.Y = sbi.dwCursorPosition.Y+1; pos.Y < sbi.dwSize.Y; pos.Y++) { |
122 | FillConsoleOutputCharacterA(console, ' ', sbi.dwSize.X, | 128 | FillConsoleOutputCharacterA(console, ' ', sbi.dwSize.X, |
123 | pos, &dummy); | 129 | pos, &dummy); |
130 | FillConsoleOutputAttribute(console, plain_attr, sbi.dwSize.X, | ||
131 | pos, &dummy); | ||
132 | } | ||
124 | } | 133 | } |
125 | 134 | ||
126 | static void move_cursor_row(int n) | 135 | static void move_cursor_row(int n) |
@@ -313,11 +322,13 @@ static const char *set_attr(const char *str) | |||
313 | if (!len) | 322 | if (!len) |
314 | move_cursor(0, 0); | 323 | move_cursor(0, 0); |
315 | else { | 324 | else { |
316 | int row = strtol(str, (char **)&str, 10); | 325 | int row, col = 1; |
326 | |||
327 | row = strtol(str, (char **)&str, 10); | ||
317 | if (*str == ';') { | 328 | if (*str == ';') { |
318 | int col = strtol(str+1, (char **)&str, 10); | 329 | col = strtol(str+1, (char **)&str, 10); |
319 | move_cursor(col-1, row-1); | ||
320 | } | 330 | } |
331 | move_cursor(col > 0 ? col-1 : 0, row > 0 ? row-1 : 0); | ||
321 | } | 332 | } |
322 | break; | 333 | break; |
323 | case 'J': | 334 | case 'J': |