Mercurial > mxe-octave
view src/readline-2-event-hook.patch @ 4601:dc3eb553f5e9
update UPDATE rule for sourceforge projects with version directories
* src/cppunit.mk, src/cunit.mk, src/expat.mk, src/freeimage.mk, src/freetype.mk,
src/gnuplot.mk, src/graphicsmagick.mk, src/hunspell.mk, src/id3lib.mk, src/lcms.mk,
src/libircclient.mk, src/liblo.mk, src/libmad.mk, src/libmng.mk, src/libmodplug.mk,
src/libusb.mk, src/matio.mk, src/pcre.mk, src/pdcurses.mk, src/pfstools.mk,
src/plotmm.mk, src/qjson.mk, src/qwt.mk, src/qwtplot3d.mk, src/sdl_pango.mk,
src/sox.mk, src/tinyxml.mk, src/xmlwrapp.mk:
update UPDATE rule for sourceforge projects with version directories
* src/llvm.mk: update use wget not WGE so get uncompressed file)
author | John D |
---|---|
date | Mon, 29 Jan 2018 11:57:20 -0500 |
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