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

Takashi Yano tyan0@sourceware.org
Tue Mar 3 11:06:19 GMT 2026


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

commit b7541ef1242ac2e5d46fb1ac8704024f99042c47
Author: Takashi Yano <takashi.yano@nifty.ne.jp>
Date:   Thu Feb 19 17:13:55 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 | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/winsup/cygwin/fhandler/pty.cc b/winsup/cygwin/fhandler/pty.cc
index 88a3d1cfe..b59f54096 100644
--- a/winsup/cygwin/fhandler/pty.cc
+++ b/winsup/cygwin/fhandler/pty.cc
@@ -2692,8 +2692,12 @@ workarounds_for_pseudo_console_output (char *outbuf, DWORD rlen)
 	assert (state == 2);
 	if (outbuf[i-1] == '[' && outbuf[i] == '>')
 	  saw_greater_than_sign = true;
-	else if (isdigit (outbuf[i]) || outbuf[i] == ';')
-	  continue;
+	else if (outbuf[i-1] == '[' && outbuf[i] == '?')
+	  saw_question_mark = true;
+	else if (isdigit (outbuf[i]))
+	  arg = arg * 10 + (outbuf[i] - '0');
+	else if (outbuf[i] == ';')
+	  arg = 0;
 	else if (saw_greater_than_sign && outbuf[i] == 'm')
 	  {
 	    /* Remove CSI > Pm m */
@@ -2722,6 +2726,14 @@ workarounds_for_pseudo_console_output (char *outbuf, DWORD rlen)
 	      }
 	    state = 0;
 	  }
+	else if (saw_question_mark && arg == 9001
+		 && (outbuf[i] == 'h' || outbuf[i] == 'l'))
+	  {
+	    memmove (&outbuf[start_at], &outbuf[i+1], rlen-i-1);
+	    rlen = start_at + rlen - i - 1;
+	    i = start_at - 1;
+	    state = 0;
+	  }
 	else if (outbuf[i] == '\033')
 	  {
 	    start_at = i;
@@ -2734,6 +2746,8 @@ workarounds_for_pseudo_console_output (char *outbuf, DWORD rlen)
 	  {
 	    is_csi = false;
 	    saw_greater_than_sign = false;
+	    saw_question_mark = false;
+	    arg = 0;
 	  }
       }
     else if (is_osc)


More information about the Cygwin-cvs mailing list