aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-09-15 16:52:43 +1000
committerNguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-09-15 16:52:43 +1000
commitbfd04f89be0bdfaef60e9bb21b882e77c8590c76 (patch)
tree9ce197698ace2d57bd6a087fb07e583f52c2228c
parent924d22029b978432c4a65a905a981b4661102edf (diff)
parent7a30dffb59673ef5b5e1ff30248d2e72d6814fd5 (diff)
downloadbusybox-w32-bfd04f89be0bdfaef60e9bb21b882e77c8590c76.tar.gz
busybox-w32-bfd04f89be0bdfaef60e9bb21b882e77c8590c76.tar.bz2
busybox-w32-bfd04f89be0bdfaef60e9bb21b882e77c8590c76.zip
Merge branch 'ash'
-rw-r--r--scripts/defconfig.mingw322
-rw-r--r--win32/termios.c45
-rw-r--r--win32/winansi.c59
3 files changed, 97 insertions, 9 deletions
diff --git a/scripts/defconfig.mingw32 b/scripts/defconfig.mingw32
index 1669380ac..ff4b006cb 100644
--- a/scripts/defconfig.mingw32
+++ b/scripts/defconfig.mingw32
@@ -101,7 +101,7 @@ CONFIG_MD5_SIZE_VS_SPEED=2
101CONFIG_FEATURE_EDITING=y 101CONFIG_FEATURE_EDITING=y
102CONFIG_FEATURE_EDITING_MAX_LEN=1024 102CONFIG_FEATURE_EDITING_MAX_LEN=1024
103# CONFIG_FEATURE_EDITING_VI is not set 103# CONFIG_FEATURE_EDITING_VI is not set
104CONFIG_FEATURE_EDITING_HISTORY=0 104CONFIG_FEATURE_EDITING_HISTORY=64
105# CONFIG_FEATURE_EDITING_SAVEHISTORY is not set 105# CONFIG_FEATURE_EDITING_SAVEHISTORY is not set
106CONFIG_FEATURE_TAB_COMPLETION=y 106CONFIG_FEATURE_TAB_COMPLETION=y
107# CONFIG_FEATURE_USERNAME_COMPLETION is not set 107# CONFIG_FEATURE_USERNAME_COMPLETION is not set
diff --git a/win32/termios.c b/win32/termios.c
index 6d85ff98e..e2dc96361 100644
--- a/win32/termios.c
+++ b/win32/termios.c
@@ -12,25 +12,54 @@ int tcgetattr(int fd UNUSED_PARAM, struct termios *t UNUSED_PARAM)
12 12
13int64_t FAST_FUNC read_key(int fd, char *buf, int timeout UNUSED_PARAM) 13int64_t FAST_FUNC read_key(int fd, char *buf, int timeout UNUSED_PARAM)
14{ 14{
15 static int initialized = 0;
16 HANDLE cin = GetStdHandle(STD_INPUT_HANDLE); 15 HANDLE cin = GetStdHandle(STD_INPUT_HANDLE);
17 INPUT_RECORD record; 16 INPUT_RECORD record;
18 DWORD nevent_out; 17 DWORD nevent_out, mode;
18 int ret = -1;
19 19
20 if (fd != 0) 20 if (fd != 0)
21 bb_error_msg_and_die("read_key only works on stdin"); 21 bb_error_msg_and_die("read_key only works on stdin");
22 if (cin == INVALID_HANDLE_VALUE) 22 if (cin == INVALID_HANDLE_VALUE)
23 return -1; 23 return -1;
24 if (!initialized) { 24 GetConsoleMode(cin, &mode);
25 SetConsoleMode(cin, ENABLE_ECHO_INPUT); 25 SetConsoleMode(cin, 0);
26 initialized = 1;
27 }
28 26
29 while (1) { 27 while (1) {
30 if (!ReadConsoleInput(cin, &record, 1, &nevent_out)) 28 if (!ReadConsoleInput(cin, &record, 1, &nevent_out))
31 return -1; 29 goto done;
32 if (record.EventType != KEY_EVENT || !record.Event.KeyEvent.bKeyDown) 30 if (record.EventType != KEY_EVENT || !record.Event.KeyEvent.bKeyDown)
33 continue; 31 continue;
34 return record.Event.KeyEvent.uChar.AsciiChar; 32 if (!record.Event.KeyEvent.uChar.AsciiChar) {
33 DWORD state = record.Event.KeyEvent.dwControlKeyState;
34 switch (record.Event.KeyEvent.wVirtualKeyCode) {
35 case VK_DELETE: return KEYCODE_DELETE;
36 case VK_INSERT: return KEYCODE_INSERT;
37 case VK_UP: return KEYCODE_UP;
38 case VK_DOWN: return KEYCODE_DOWN;
39 case VK_RIGHT:
40 if (state & (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED))
41 return KEYCODE_CTRL_RIGHT;
42 return KEYCODE_RIGHT;
43 case VK_LEFT:
44 if (state & (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED))
45 return KEYCODE_CTRL_LEFT;
46 return KEYCODE_LEFT;
47 case VK_HOME: return KEYCODE_HOME;
48 case VK_END: return KEYCODE_END;
49 case VK_PRIOR: return KEYCODE_PAGEUP;
50 case VK_NEXT: return KEYCODE_PAGEDOWN;
51 case VK_CAPITAL:
52 case VK_SHIFT:
53 case VK_CONTROL:
54 case VK_MENU:
55 break;
56 }
57 continue;
58 }
59 ret = record.Event.KeyEvent.uChar.AsciiChar;
60 break;
35 } 61 }
62 done:
63 SetConsoleMode(cin, mode);
64 return ret;
36} 65}
diff --git a/win32/winansi.c b/win32/winansi.c
index e2e7010fb..d95bd473b 100644
--- a/win32/winansi.c
+++ b/win32/winansi.c
@@ -91,6 +91,48 @@ static void erase_in_line(void)
91 NULL); 91 NULL);
92} 92}
93 93
94static void erase_till_end_of_screen(void)
95{
96 CONSOLE_SCREEN_BUFFER_INFO sbi;
97 COORD pos;
98
99 if (!console)
100 return;
101
102 GetConsoleScreenBufferInfo(console, &sbi);
103 FillConsoleOutputCharacterA(console, ' ',
104 sbi.dwSize.X - sbi.dwCursorPosition.X, sbi.dwCursorPosition,
105 NULL);
106
107 pos.X = 0;
108 for (pos.Y = sbi.dwCursorPosition.Y+1; pos.Y < sbi.dwSize.Y; pos.Y++)
109 FillConsoleOutputCharacterA(console, ' ', sbi.dwSize.X,
110 pos, NULL);
111}
112
113static void move_cursor_back(int n)
114{
115 CONSOLE_SCREEN_BUFFER_INFO sbi;
116
117 if (!console)
118 return;
119
120 GetConsoleScreenBufferInfo(console, &sbi);
121 sbi.dwCursorPosition.X -= n;
122 SetConsoleCursorPosition(console, sbi.dwCursorPosition);
123}
124
125static void move_cursor(int x, int y)
126{
127 COORD pos;
128
129 if (!console)
130 return;
131
132 pos.X = x;
133 pos.Y = y;
134 SetConsoleCursorPosition(console, pos);
135}
94 136
95static const char *set_attr(const char *str) 137static const char *set_attr(const char *str)
96{ 138{
@@ -230,6 +272,23 @@ static const char *set_attr(const char *str)
230 272
231 set_console_attr(); 273 set_console_attr();
232 break; 274 break;
275 case 'D':
276 move_cursor_back(strtol(str, (char **)&str, 10));
277 break;
278 case 'H':
279 if (!len)
280 move_cursor(0, 0);
281 else {
282 int row = strtol(str, (char **)&str, 10);
283 if (*str == ';') {
284 int col = strtol(str+1, (char **)&str, 10);
285 move_cursor(col, row);
286 }
287 }
288 break;
289 case 'J':
290 erase_till_end_of_screen();
291 break;
233 case 'K': 292 case 'K':
234 erase_in_line(); 293 erase_in_line();
235 break; 294 break;