view src/readline-2-event-hook.patch @ 4654:b9e4ebcad82f

disable doc extraction for optim package Disable the rules for extracting doc strings because they don't work when cross compiling. Our patches to the source files don't touch the doc strings, so there is no need to update them anyway.
author John W. Eaton <jwe@octave.org>
date Tue, 10 Apr 2018 07:50:10 -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