Mercurial > mxe-octave
view src/readline-2-event-hook.patch @ 4359:2c47a4853d1a
freetds: update to 1.00.27
* src/freetds.mk: update version, checksum
author | John D |
---|---|
date | Mon, 13 Mar 2017 08:13:03 -0400 |
parents | 098ca5276ab8 |
children |
line wrap: on
line source
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 <stdio.h> #include <errno.h> +#if defined (__MINGW32__) +# define WIN32_LEAN_AND_MEAN +# include <windows.h> +#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