# HG changeset patch # User Michael Goffioul # Date 1385769020 18000 # Node ID 098ca5276ab807dddfa5d93b8ecd3ae6e71494c6 # Parent 77edea1af4f1eda929ae90921c9dc0a707ecff5f Add readline patch for interrupt and CPU usage. * src/readline-2-event-hook.patch: New patch to allow interrupting readline and throttle the event-hook loop. diff -r 77edea1af4f1 -r 098ca5276ab8 src/readline-2-event-hook.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/readline-2-event-hook.patch Fri Nov 29 18:50:20 2013 -0500 @@ -0,0 +1,174 @@ +diff -ur readline-6.2-orig/input.c readline-6.2/input.c +--- readline-6.2-orig/input.c 2013-11-24 19:19:30 -0500 ++++ readline-6.2/input.c 2013-11-29 11:19:59 -0500 +@@ -54,6 +54,11 @@ + #include + #include + ++#if defined (__MINGW32__) ++# define WIN32_LEAN_AND_MEAN ++# include ++#endif ++ + #if !defined (errno) + extern int errno; + #endif /* !errno */ +@@ -96,6 +101,11 @@ + static unsigned char ibuffer[512]; + static int ibuffer_len = sizeof (ibuffer) - 1; + ++#if defined (__MINGW32__) ++static int _win32_getch (void); ++static int _win32_kbhit (void); ++#endif ++ + #define any_typein (push_index != pop_index) + + int +@@ -219,8 +229,8 @@ + #if defined (__MINGW32__) + /* Use getch/_kbhit to check for available console input, in the same way + that we read it normally. */ +- chars_avail = isatty (tty) ? _kbhit () : 0; +- result = 0; ++ chars_avail = isatty (tty) ? _win32_kbhit () : 0; ++ result = 0; + #endif + + /* If there's nothing available, don't waste time trying to read +@@ -457,6 +467,123 @@ + return (c); + } + ++#if defined (__MINGW32__) ++ ++#define _WIN32_READ_NOCHAR (-2) ++ ++static char _win32_buf[16] = {'0'}; ++static int _win32_bufidx = 0; ++ ++static int ++_win32_getch_internal (int block) ++{ ++ INPUT_RECORD rec; ++ DWORD evRead, waitResult; ++ HANDLE hInput = (HANDLE) _get_osfhandle (fileno (rl_instream)); ++ ++ if (_win32_bufidx > 0) ++ return _win32_buf[--_win32_bufidx]; ++ ++ hInput = (HANDLE) _get_osfhandle (fileno (rl_instream)); ++ ++ do ++ { ++ if (! block) ++ { ++ if (WaitForSingleObject(hInput, _keyboard_input_timeout/1000) != WAIT_OBJECT_0) ++ return _WIN32_READ_NOCHAR; ++ } ++ ++ if (!ReadConsoleInput(hInput, &rec, 1, &evRead) || evRead != 1) ++ return EOF; ++ ++ switch (rec.EventType) ++ { ++ case KEY_EVENT: ++ if ((rec.Event.KeyEvent.bKeyDown && ++ (rec.Event.KeyEvent.wVirtualKeyCode < VK_SHIFT || ++ rec.Event.KeyEvent.wVirtualKeyCode > VK_MENU)) || ++ (!rec.Event.KeyEvent.bKeyDown && ++ rec.Event.KeyEvent.wVirtualKeyCode == VK_MENU && ++ rec.Event.KeyEvent.uChar.AsciiChar)) ++ { ++ if (rec.Event.KeyEvent.uChar.AsciiChar) ++ { ++ if (rec.Event.KeyEvent.uChar.AsciiChar < 0 || ++ (rec.Event.KeyEvent.uChar.AsciiChar < 32 && ++ !(rec.Event.KeyEvent.dwControlKeyState & (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED)))) ++ { ++ char c = rec.Event.KeyEvent.uChar.AsciiChar; ++ if (GetOEMCP () == GetConsoleCP ()) ++ OemToCharBuff (&c, &c, 1); ++ return (int)(unsigned char)c; ++ } ++ else ++ return (int)rec.Event.KeyEvent.uChar.UnicodeChar; ++ } ++ else ++ switch (rec.Event.KeyEvent.wVirtualKeyCode) ++ { ++ case VK_UP: ++ _win32_buf[_win32_bufidx++] = 'H'; ++ return 0340; ++ case VK_DOWN: ++ _win32_buf[_win32_bufidx++] = 'P'; ++ return 0340; ++ case VK_RIGHT: ++ _win32_buf[_win32_bufidx++] = 'M'; ++ return 0340; ++ case VK_LEFT: ++ _win32_buf[_win32_bufidx++] = 'K'; ++ return 0340; ++ case VK_HOME: ++ _win32_buf[_win32_bufidx++] = 'G'; ++ return 0340; ++ case VK_END: ++ _win32_buf[_win32_bufidx++] = 'O'; ++ return 0340; ++ case VK_DELETE: ++ _win32_buf[_win32_bufidx++] = 'S'; ++ return 0340; ++ default: ++ break; ++ } ++ } ++ break; ++ ++ case WINDOW_BUFFER_SIZE_EVENT: ++ rl_resize_terminal (); ++ break; ++ ++ default: ++ break; ++ } ++ } ++ while (1); ++} ++ ++static int ++_win32_kbhit (void) ++{ ++ int result; ++ ++ result = _win32_getch_internal (0); ++ if (result == _WIN32_READ_NOCHAR ++ || result == EOF) ++ return 0; ++ _win32_buf[_win32_bufidx++] = result; ++ ++ return _win32_bufidx; ++} ++ ++static int ++_win32_getch (void) ++{ ++ return _win32_getch_internal (1); ++} ++ ++#endif ++ + int + rl_getc (stream) + FILE *stream; +@@ -471,9 +598,9 @@ + #if defined (__MINGW32__) + if (isatty (fileno (stream))) + { +- int c = _getch (); ++ int c = _win32_getch (); + if (c == 0xe0) +- rl_execute_next (_getch ()); ++ rl_execute_next (_win32_getch ()); + return (c); + } + #endif