[newlib-cygwin/cygwin-3_6-branch] Cygwin: pty: Omit win32-input-mode sequence from pseudo console

Takashi Yano tyan0@sourceware.org
Tue Mar 3 10:59:46 GMT 2026


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=e749a11bb7da29a13f600ac95674673240dca9fe

commit e749a11bb7da29a13f600ac95674673240dca9fe
Author: Takashi Yano <takashi.yano@nifty.ne.jp>
Date:   Thu Feb 19 18:28:08 2026 +0900

    Cygwin: pty: Omit win32-input-mode sequence from pseudo console
    
    In Windows 11, pseudo console uses CSI?9001h which lets the terminal
    enter win32-input-mode in console. As a result, two problems happen.
    
    1) If non-cygwin app is running in script command on the console,
       Ctrl-C terminates not only the non-cygwin app, but also script
       command without cleanup for the pseudo console.
    
    2) Some remnants sequences from win32-input-mode occasionally
       appears on the shell in script command on the console.
    
    This patch fixes them by omit CSI?9001h to prevent the terminal
    from entering win32-input-mode.
    
    Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
    Suggested-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
    Reviewed-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>

Diff:
---
 winsup/cygwin/fhandler/pty.cc | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/winsup/cygwin/fhandler/pty.cc b/winsup/cygwin/fhandler/pty.cc
index 026011984..9412b67d4 100644
--- a/winsup/cygwin/fhandler/pty.cc
+++ b/winsup/cygwin/fhandler/pty.cc
@@ -2730,6 +2730,38 @@ fhandler_pty_master::pty_master_fwd_thread (const master_fwd_thread_param_t *p)
 	    else
 	      state = 0;
 
+	  /* Remove CSI ? 9001 h/l (win32-input-mode) */
+	  int arg = 0;
+	  state = 0;
+	  for (DWORD i = 0; i < rlen; i++)
+	    if (outbuf[i] == '\033')
+	      {
+		start_at = i;
+		state = 1;
+		continue;
+	      }
+	    else if ((state == 1 && outbuf[i] == '[')
+		     || (state == 2 && outbuf[i] == '?'))
+	      {
+		state ++;
+		continue;
+	      }
+	    else if (state == 3 && isdigit (outbuf[i]))
+	      arg = arg * 10 + (outbuf[i] - '0');
+	    else if (state == 3 && outbuf[i] == ';')
+	      arg = 0;
+	    else if (state == 3 && arg == 9001
+		     && (outbuf[i] == 'h' || outbuf[i] == 'l'))
+	      {
+		memmove (&outbuf[start_at], &outbuf[i+1], rlen-i-1);
+		rlen = wlen = start_at + rlen - i - 1;
+		state = 0;
+		i = start_at - 1;
+		continue;
+	      }
+	    else
+	      state = 0;
+
 	  /* Remove OSC Ps ; ? BEL/ST */
 	  state = 0;
 	  for (DWORD i = 0; i < rlen; i++)


More information about the Cygwin-cvs mailing list