view src/readline-2-event-hook.patch @ 5893:53a6c7df43f8

Mesa 3D: Update to version 21.1.8. * src/mesa.mk: Update version and checksum. * src/mesa-2-uninitialized.patch: Remove file. * dist-files.mk: Remove file from list.
author Markus Mützel <markus.muetzel@gmx.de>
date Thu, 16 Sep 2021 22:37:45 +0200
parents 41e50d658de0
children a76f513700df
line wrap: on
line source

diff -ur readline-8.1.3/input.c readline-8.1.4/input.c
--- readline-8.1.3/input.c	2020-12-19 07:56:01.572775578 -0500
+++ readline-8.1.4/input.c	2020-12-19 07:57:24.608319024 -0500
@@ -142,6 +142,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
@@ -268,7 +273,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
 
@@ -520,6 +525,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)
 {
@@ -539,9 +658,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