CTRL-U broken by OemToCharBuff?

Chris Faylor cgf@cygnus.com
Sun Jul 9 20:00:00 GMT 2000


On Sun, Jul 09, 2000 at 09:53:23PM -0400, cgf wrote:
>The new OemToCharBuff call translates a CTRL-U to 0xa7 for some reason.
>Kazuhiro, can you explain this?  It causes me problems when I try
>to use CTRL-U to wipe out a line of text.
>
>If I have something set up wrong, I assume I won't be the only one so
>we're going to have to rectify this.

The patch below seems to perform the same function as Kazuhiro's
original, at the expense of slightly more code.  For some reason,
WideCharToMultiByte does not screw up CTRL-U.

I'm not entirely certain why we're converting to ansi, though?  Why not
just use the OEM code page and avoid this conversion?

cgf

Index: fhandler_console.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/fhandler_console.cc,v
retrieving revision 1.9
diff -u -p -r1.9 fhandler_console.cc
--- fhandler_console.cc	2000/07/04 02:26:20	1.9
+++ fhandler_console.cc	2000/07/10 02:55:51
@@ -128,6 +128,7 @@ fhandler_console::read (void *pv, size_t
 
   HANDLE w4[2];
   DWORD nwait;
+  char tmp[17];
 
   w4[0] = h;
   if (iscygthread ())
@@ -155,11 +156,12 @@ fhandler_console::read (void *pv, size_t
 	  __seterrno ();
 	  return -1;
 	}
+
       DWORD nread;
       INPUT_RECORD input_rec;
       const char *toadd;
 
-      if (!ReadConsoleInput (h, &input_rec, 1, &nread))
+      if (!ReadConsoleInputW (h, &input_rec, 1, &nread))
 	{
 	  syscall_printf ("ReadConsoleInput failed, %E");
 	  __seterrno ();
@@ -167,6 +169,7 @@ fhandler_console::read (void *pv, size_t
 	}
 
 #define ich (input_rec.Event.KeyEvent.uChar.AsciiChar)
+#define wch (input_rec.Event.KeyEvent.uChar.UnicodeChar)
 
       /* check if we're just disposing of this one */
 
@@ -179,7 +182,7 @@ fhandler_console::read (void *pv, size_t
 	  !input_rec.Event.KeyEvent.bKeyDown)
 	continue;
 
-      if (ich == 0 ||
+      if (wch == 0 ||
 	  /* arrow/function keys */
 	  (input_rec.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY))
 	{
@@ -188,18 +191,18 @@ fhandler_console::read (void *pv, size_t
 	    continue;
 	  nread = strlen (toadd);
 	}
-      else if (!(input_rec.Event.KeyEvent.dwControlKeyState & LEFT_ALT_PRESSED))
-	{
-	  OemToCharBuff (&ich, &ich, 1);
-	  toadd = &ich;
-	}
       else
 	{
-	  static char tmp[2];
-	  tmp[0] = '\033';
-	  tmp[1] = tolower (ich);
-	  toadd = tmp;
-	  nread = 2;
+	  nread = WideCharToMultiByte (CP_ACP, 0, &wch, 1, tmp + 1, sizeof (tmp) - 1, NULL, NULL);
+	  if (!(input_rec.Event.KeyEvent.dwControlKeyState & LEFT_ALT_PRESSED))
+	    toadd = tmp + 1;
+	  else
+	    {
+	      tmp[0] = '\033';
+	      tmp[1] = tolower (tmp[1]);
+	      toadd = tmp;
+	      nread++;
+	    }
 	}
 
       if (line_edit (toadd, nread))


More information about the Cygwin-developers mailing list