[PATCH] Cygwin: console: Disable xterm mode for non cygwin process only.

Takashi Yano takashi.yano@nifty.ne.jp
Wed Jan 1 06:52:00 GMT 2020


- Special function keys such as arrow keys or function keys do not
  work in ConEmu with cygwin-connector after commit
  6a06c6bc8f8492ea09aa3ae180fe94e4ac265611. This patch fixes the
  issue.
---
 winsup/cygwin/fhandler_console.cc |  8 --------
 winsup/cygwin/spawn.cc            | 29 ++++++++++++++++++++++++++++-
 2 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
index b3095bbe3..e4e21e65e 100644
--- a/winsup/cygwin/fhandler_console.cc
+++ b/winsup/cygwin/fhandler_console.cc
@@ -2973,14 +2973,6 @@ fhandler_console::fixup_after_fork_exec (bool execing)
 {
   set_unit ();
   setup_io_mutex ();
-  if (wincap.has_con_24bit_colors () && !con_is_legacy)
-    {
-      DWORD dwMode;
-      /* Disable xterm compatible mode in input */
-      GetConsoleMode (get_handle (), &dwMode);
-      dwMode &= ~ENABLE_VIRTUAL_TERMINAL_INPUT;
-      SetConsoleMode (get_handle (), dwMode);
-    }
 }
 
 // #define WINSTA_ACCESS (WINSTA_READATTRIBUTES | STANDARD_RIGHTS_READ | STANDARD_RIGHTS_WRITE | WINSTA_CREATEDESKTOP | WINSTA_EXITWINDOWS)
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index cea79e326..efd82c3c2 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -29,6 +29,14 @@ details. */
 #include "winf.h"
 #include "ntdll.h"
 
+/* Not yet defined in Mingw-w64 */
+#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
+#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
+#endif /* ENABLE_VIRTUAL_TERMINAL_PROCESSING */
+#ifndef ENABLE_VIRTUAL_TERMINAL_INPUT
+#define ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200
+#endif /* ENABLE_VIRTUAL_TERMINAL_INPUT */
+
 static const suffix_info exe_suffixes[] =
 {
   suffix_info ("", 1),
@@ -610,7 +618,26 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv,
 		}
 	    }
 	  else if (fh && fh->get_major () == DEV_CONS_MAJOR)
-	    attach_to_console = true;
+	    {
+	      attach_to_console = true;
+	      if (wincap.has_con_24bit_colors () && !iscygwin ())
+		{
+		  DWORD dwMode;
+		  if (fd == 0)
+		    {
+		      /* Disable xterm compatible mode in input */
+		      GetConsoleMode (fh->get_handle (), &dwMode);
+		      dwMode &= ~ENABLE_VIRTUAL_TERMINAL_INPUT;
+		      SetConsoleMode (fh->get_handle (), dwMode);
+		    }
+		  else
+		    {
+		      GetConsoleMode (fh->get_output_handle (), &dwMode);
+		      dwMode &= ~ENABLE_VIRTUAL_TERMINAL_PROCESSING;
+		      SetConsoleMode (fh->get_output_handle (), dwMode);
+		    }
+		}
+	    }
 	}
 
       /* Set up needed handles for stdio */
-- 
2.21.0



More information about the Cygwin-patches mailing list