Mercurial > mxe-octave
diff src/readline-2-event-hook.patch @ 5031:5049ab5e66f6
Re-add readline patches to work with readline 8 (Bug #55957)
* src/readline-1-display.patch, src/readline-1-input.patch,
src/readline-1-sigwinch.patch, src/readline-2-event-hook.patch
dist-files.mk: add refes to added files
author | John Donoghue |
---|---|
date | Thu, 21 Mar 2019 09:34:09 -0400 |
parents | |
children | 41e50d658de0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/readline-2-event-hook.patch Thu Mar 21 09:34:09 2019 -0400 @@ -0,0 +1,157 @@ +diff -ur readline-8.0.sigwinch/input.c readline-8.0/input.c +--- readline-8.0.sigwinch/input.c 2019-03-20 08:15:55.450361377 -0400 ++++ readline-8.0/input.c 2019-03-20 08:30:58.059756179 -0400 +@@ -140,6 +140,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 +@@ -266,7 +271,7 @@ + #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; ++ chars_avail = isatty (tty) ? _win32_kbhit () : 0; + result = 0; + #endif + +@@ -501,6 +506,120 @@ + 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 (FILE *stream) + { +@@ -520,9 +639,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