aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2015-07-17 19:21:51 +0100
committerRon Yorston <rmy@pobox.com>2015-07-17 19:21:51 +0100
commit843b490b155eb2e531359910b1d4861f83d69109 (patch)
tree0aa07e92c92fe7f8e5126a3544d40ded67678b5d
parent9fe16f6102d8ab907c056c484988057904092c06 (diff)
downloadbusybox-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.c19
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
106static void erase_till_end_of_screen(void) 109static 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
126static void move_cursor_row(int n) 135static 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':