- 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