4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-01-22 23:17:28 +08:00

399 Commits

Author SHA1 Message Date
Takashi Yano
e1026837dd Cygwin: console: Fix OSC sequence handling.
- Currently, some OSC escape sequences, such as 'OSC 110 BEL', are
  not handled correctly. This patch fixes the issue.
2021-12-02 11:26:26 +09:00
Takashi Yano
c8b779aff4 Cygwin: console: Fix interference issue regarding master thread.
- This patch fixes the issue that ReadConsoleInputW() call in the
  master thread interferes with the input process of non-cygwin apps.
2021-11-18 14:17:15 +09:00
Johannes Schindelin
782aac590a Cygwin: console: Handle Unicode surrogate pairs.
When running Cygwin's Bash in the Windows Terminal (see
https://docs.microsoft.com/en-us/windows/terminal/ for details), Cygwin
is receiving keyboard input in the form of UTF-16 characters.

UTF-16 has that awkward challenge that it cannot map the full Unicode
range, and to make up for it, there are the ranges U+D800-U+DBFF and
U+DC00-U+DFFF which are illegal except when they come in a pair encoding
for Unicode characters beyond U+FFFF.

Cygwin does not handle such surrogate pairs correctly at the moment, as
can be seen e.g. when running Cygwin's Bash in the Windows Terminal and
then inserting an emoji (e.g. via Windows + <dot>, which opens an emoji
picker on recent Windows versions): Instead of showing an emoji, this
shows the infamous question mark in a black triangle, i.e. the invalid
Unicode character.

Let's special-case surrogate pairs in this scenario.

This fixes https://github.com/git-for-windows/git/issues/3281

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2021-11-16 23:20:43 +09:00
Takashi Yano
561767fc59 Cygwin: console: Fix a bug on input when signalled.
- This patch fixes the bug that Ctrl-C sometimes does not work as
  expected in Windows Terminal.

Addresses:
  https://cygwin.com/pipermail/cygwin/2021-November/249749.html
2021-11-02 11:20:50 +01:00
Corinna Vinschen
4bc8f1adb4 Cygwin: drop support for simple invisible console code
i. e., Vista/2008.

AllocConsole appears to allow creating a console only on the currently
visible desktop since Windows 7, which broke the simple code opening
the console on an invisible desktop in an invisible window station.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2021-10-29 18:19:45 +02:00
Takashi Yano
dcd564f65c Cygwin: pty: Fix handle leak regarding attach_mutex.
- If the process having master pty opened is forked, attach_mutex
  fails to be closed when master is closed. This patch fixes the
  issue.
2021-10-10 08:57:51 -04:00
Ken Brown
e5fcb021cc Cygwin: allow open_setup to fail
Convert fhandler_base::open_setup to a (virtual) method that returns a
bool result.  For the moment, it and its overrides always return true.
2021-09-18 08:40:11 -04:00
Takashi Yano
98e3aeb1f5 Cygwin: console: Fix garbled input for non-ASCII chars.
- After the commit ff4440fc, non-ASCII input may sometimes be garbled.
  This patch fixes the issue.

  Addresses: https://cygwin.com/pipermail/cygwin/2021-June/248775.html
2021-07-06 16:04:44 +02:00
Corinna Vinschen
bc184284cb Revert "Cygwin: console: Fix garbled input for non-ASCII chars."
This reverts commit 1b242c12aa7f34d89d57023f3c33f5f88d89d476.
2021-07-06 16:04:22 +02:00
Takashi Yano
1b242c12aa Cygwin: console: Fix garbled input for non-ASCII chars.
- After the commit ff4440fc, non-ASCII input may sometimes be garbled.
  This patch fixes the issue.

  Addresses: https://cygwin.com/pipermail/cygwin/2021-June/248775.html
2021-07-06 16:00:20 +02:00
Corinna Vinschen
44eb416323 Cygwin: fetch Windows directory on all platforms and use throughout
Rather than fetching the system Windows directory at dll init time
only on 32 bit, fetch it on all platforms.  Store as WCHAR and
UNICODE_STRING.  Use where appropriate to simplify code.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2021-05-07 23:05:24 +02:00
Takashi Yano
b4fc81edcc Cygwin: console: Fix race issue regarding cons_master_thread().
- With this patch, the race issue regarding starting/stopping
  cons_master_thread() introduced by commit ff4440fc is fixed.

  Addresses:
    https://cygwin.com/pipermail/cygwin/2021-April/248292.html
2021-04-20 10:21:45 +02:00
Takashi Yano
a648c15309 Cygwin: console: Fix a bug in the code to fix tab position.
- With this patch, a bug in the code to fix tab position after
  resizing window is fixed.
2021-04-19 16:17:12 +02:00
Takashi Yano via Cygwin-patches
b92a6303f1 Cygwin: console, pty: Stop ignoring Ctrl-C by IGNBRK.
- Perhaps current code misunderstand meaning of the IGNBRK. As far
  as I investigated, IGNBRK is concerned with break signal in serial
  port but there is no evidence that it has effect to ignore Ctrl-C.
  This patch stops ignoring Ctrl-C by IGNBRK for non-cygwin apps.
2021-03-08 10:33:30 +01:00
Takashi Yano via Cygwin-patches
6cde7279a0 Cygwin: console: Prevent NULL pointer access in close().
- There seems to be a case that shared_console_info is not set yet
  when close() is called. This patch adds guard for such case.
2021-02-22 14:57:57 +01:00
Takashi Yano via Cygwin-patches
b56a371436 Cygwin: console: Add support for FLUSHO and Ctrl-O.
- With this patch, FLUSHO and Ctrl-O (VDISCARD) get working.
2021-02-19 18:07:57 +01:00
Takashi Yano via Cygwin-patches
48285aa36c Cygwin: console: Fix handling of Ctrl-S in Win7.
- If ENABLE_LINE_INPUT is set, Ctrl-S is handled by Windows if the
  OS is Windows 7. This conflicts with Ctrl-S handling in cygwin
  console code. This patch unsets ENABLE_LINE_INPUT flag in cygwin
  and set it when native app is executed.
2021-02-19 17:56:08 +01:00
Takashi Yano via Cygwin-patches
2b9219b4a5 Cygwin: console: Fix SIGWINCH handling in Win7.
- If ENABLE_VIRTUAL_TERMINAL_INPUT is not set, changing window height
  does not generate WINDOW_BUFFER_SIZE_EVENT. This happens if console
  is in the legacy mode. Therefore, with this patch, the windows size
  is checked every time in cons_master_thread() if the cosole is in
  the legacy mode.
2021-02-19 17:56:08 +01:00
Takashi Yano via Cygwin-patches
ff4440fcf7 Cygwin: console: Introduce new thread which handles input signal.
- Currently, Ctrl-Z, Ctrl-\ and SIGWINCH does not work in console
  if the process does not call read() or select(). This is because
  these are processed in process_input_message() which is called
  from read() or select(). This is a long standing issue of console.
  Addresses:
    https://cygwin.com/pipermail/cygwin/2020-May/244898.html
    https://cygwin.com/pipermail/cygwin/2021-February/247779.html

  With this patch, new thread which handles only input signals is
  introduced so that Crtl-Z, etc. work without calling read() or
  select(). Ctrl-S and Ctrl-Q are also handled in this thread.
2021-02-17 10:29:57 +01:00
Takashi Yano via Cygwin-patches
ad28775055 Cygwin: console: Abort read() on signal if SA_RESTART is not set.
- Currently, console read() keeps reading after SIGWINCH is sent
  even if SA_RESTART flag is not set. With this patch, read()
  returns EINTR on SIGWINCH if SA_RESTART flag is not set.
  The same problem for SIGQUIT and SIGTSTP has also been fixed.
2021-02-15 14:22:10 +01:00
Takashi Yano via Cygwin-patches
6ab2d284e5 Cygwin: console: Align the behaviour against signal with pty.
- Currently, read() returns -1 with EINTR if the process is suspended
  by Ctrl-Z and resumed by fg command, while pty continues to read.
  For example, xxd command stops with error "Interrupted system call"
  after Ctrl-Z and fg. This patch aligns the behaviour with pty (and
  Linux).
2021-02-01 10:54:04 +01:00
Takashi Yano via Cygwin-patches
0b64cc6812 Cygwin: console: Make read() thread-safe.
- Currently read() is somehow not thread-safe. This patch fixes
  the issue.
2021-02-01 10:54:04 +01:00
Takashi Yano via Cygwin-patches
460eb128cb Cygwin: console: Add missing guard regarding attach_mutex.
- The commit a5333345 did not fix the problem enough. This patch
  provides additional guard for the issue.
2021-01-25 19:54:21 +01:00
Takashi Yano via Cygwin-patches
a533334581 Cygwin: console: Fix "Bad file descriptor" error in script command.
- After the commit 72770148, script command exits occasionally with
  the error "Bad file descriptor" if it is started in console on Win7
  and non-cygwin process is executed. This patch fixes the issue.
2021-01-20 10:19:39 +01:00
Takashi Yano via Cygwin-patches
72770148ad Cygwin: pty: Prevent pty from changing code page of parent console.
- After commit 232fde0e, pty changes console code page when the first
  non-cygwin app is executed. If pty is started in real console device,
  pty changes the code page of root console. This causes very annoying
  result because changing code page changes the font of command prompt
  if console is in legacy mode. This patch avoids this by creating a
  new invisible console for the first pty started in console device.
2021-01-18 14:18:43 +01:00
Takashi Yano via Cygwin-patches
974e6d76d8 Cygwin: console: Revise the code to switch xterm mode.
- If application changes the console mode, mode management introduced
  by commit 10d8c278 will be corrupted. For example, stdout of jansi
  v2.0.1 or later is piped to less, jansi resets the xterm mode flag
  ENABLE_VIRTUAL_TERMINA_PROCESSING when jansi is terminated. This
  causes garbled output in less because less needs this flag enabled.
  This patch fixes the issue.
2021-01-18 11:02:46 +01:00
Jon Turney
129c9844a6
Cygwin: avoid GCC 10 error with -Werror=narrowing
../../../../src/winsup/cygwin/fhandler_console.cc: In member function 'const unsigned char* fhandler_console::write_normal(const unsigned char*, const unsigned char*)':
../../../../src/winsup/cygwin/fhandler_console.cc:2782:8: error: narrowing conversion of '-2' from 'int' to 'long unsigned int' [-Wnarrowing]
../../../../src/winsup/cygwin/fhandler_console.cc:2786:8: error: narrowing conversion of '-1' from 'int' to 'long unsigned int' [-Wnarrowing]
../../../../src/winsup/cygwin/fhandler_console.cc:2836:8: error: narrowing conversion of '-2' from 'int' to 'long unsigned int' [-Wnarrowing]
../../../../src/winsup/cygwin/fhandler_console.cc:2840:8: error: narrowing conversion of '-1' from 'int' to 'long unsigned int' [-Wnarrowing]

A mbtowc_p function returns an int, so that seems the correct type to use here.
2020-09-28 14:11:26 +01:00
Takashi Yano via Cygwin-patches
69a2a8db58 Cygwin: console: Replace WriteConsoleA() with WriteConsoleW().
- To allow sending non-ASCII chars to console, all WriteConsoleA()
  are replaced by WriteConsoleW().
  Addresses:
  https://cygwin.com/pipermail/cygwin-patches/2020q3/010476.html
2020-08-27 10:51:31 +02:00
Takashi Yano
bb42852062 Cygwin: pty: Implement new pseudo console support.
- In this implementation, pseudo console is created for each native
  console app. Advantages and disadvantages of this implementation
  over the previous implementation are as follows.

  Advantages:
  1) No performance degradation in pty output for cygwin process.
      https://cygwin.com/pipermail/cygwin/2020-February/243858.html
  2) Free from the problem caused by difference of behaviour of control
     sequences between real terminal and pseudo console.
      https://cygwin.com/pipermail/cygwin/2019-December/243281.html
      https://cygwin.com/pipermail/cygwin/2020-February/243855.html
  3) Free from the problem in cgdb and emacs gud.
      https://cygwin.com/pipermail/cygwin/2020-January/243601.html
      https://cygwin.com/pipermail/cygwin/2020-March/244146.html
  4) Redrawing screen on executing native console apps is not necessary.
  5) cygwin-console-helper is not necessary for the pseudo console
     support.
  6) The codes for pseudo console support are much simpler than that
     of the previous one.

  Disadvantages:
  1) The cygwin program which calls console API directly does not work.
  2) The apps which use console API cannot be debugged with gdb. This
     is because pseudo console is not activated since gdb uses
     CreateProcess() rather than exec(). Even with this limitation,
     attaching gdb to native apps, in which pseudo console is already
     activated, works.
  3) Typeahead key inputs are discarded while native console app is
     executed. Simirally, typeahead key inputs while cygwin app is
     executed are not inherited to native console app.
  4) Code page cannot be changed by chcp.com. Acctually, chcp works
     itself and changes code page of its own pseudo console.  However,
     since pseudo console is recreated for another process, it cannot
     inherit the code page.
  5) system_printf() does not work after stderr is closed. (Same with
     cygwin 3.0.7)
  6) Startup time of native console apps is about 3 times slower than
     previous implemenation.
  7) Pseudo console cannot be activated if it is already activated for
     another process on same pty.
2020-08-22 13:43:49 +02:00
Corinna Vinschen
462fcdb67f Cygwin: convert sys_wcstombs/sys_mbstowcs wrapper to inline functions
This should slightly speed up especially path conversions,
given there's one less function call rearranging all function
arguments in registers/stack (and less stack pressure).

For clarity, rename overloaded  sys_wcstombs to _sys_wcstombs
and sys_cp_mbstowcs to _sys_mbstowcs.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2020-07-10 10:29:33 +02:00
Takashi Yano via Cygwin-patches
4527541ec6 Cygwin: console: Discard some unsupported escape sequences.
- If the cygwin vim is started from a non-cygwin process which is
  executed in pseudo console, shift key and ctrl key do not work.
  In this case, vim is executed under /dev/cons*. If vim outputs
  escape sequence which is not supported by pseudo console, the
  escape sequence is leaked into the parent pty. This causes
  unexpected results. This patch fixes the issue by discarding
  "CSI > Pm m". "OSC 10;? BEL/ST" and "OSC 11;? BEL/ST" are
  discarded as well.
2020-05-31 10:33:55 +02:00
Takashi Yano via Cygwin-patches
0c5aab9c99 Cygwin: console: Make cursor keys work in vim under ConEmu.
- After commit 774b8996d1f3e535e8267be4eb8e751d756c2cec, cursor
  keys do not work in vim under ConEmu without cygwin-connector.
  This patch fixes the issue.
2020-05-30 17:05:17 +02:00
Takashi Yano
3e7fff6b49 Cygwin: console: Fix behaviour of "ESC 8" after reset.
- This patch matches the behaviour of "ESC 8" (DECRC) to the real
  xterm after full reset (RIS), soft reset (DECSTR) and "CSI 3 J".
2020-03-09 09:52:06 +01:00
Hans-Bernhard Broeker
bf0cb64d90 Do not bother passing optional argument to WriteConsoleA.
Passing a pointer to a local variable to WriteConsoleA is
not actually needed if we're not going to do anything with
what WriteConsoleA would put in there.

For the wpbuf class the pointer argument was made optional,
so it can be just left out; other call places now pass a
NULL pointer instead.  The local variables `wn' and `n'
are no unused, so they go away.
2020-03-09 09:52:06 +01:00
Hans-Bernhard Broeker
b0f78f15b7 Collect handling of wpixput and wpbuf into a helper class.
Replace direct access to a pair of co-dependent variables
by calls to methods of a class that encapsulates their relation.

Also replace C #define by C++ class constant.
2020-03-09 09:52:06 +01:00
Corinna Vinschen
ecf27dd2e0 Cygwin: console: convert wpbuf_put to inline function
fix potential buffer overrun while at it

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2020-03-02 20:30:09 +01:00
Takashi Yano
b4bc238311 Cygwin: console: Add a workaround for "ESC 7" and "ESC 8".
- In xterm compatible mode, "ESC 7" and "ESC 8" do not work properly
  in the senario:
   1) Execute /bin/ls /bin to fill screen.
   2) Sned CSI?1049h to alternate screen.
   3) Reduce window size.
   4) Send CSI?1049l to resume screen.
   5) Send "ESC 7" and "ESC 8".
  After sending "ESC 8", the cursor goes to incorrect position. This
  patch adds a workaround for this issue.
2020-03-02 19:46:40 +01:00
Takashi Yano
750cd6e5b2 Cygwin: console: Prevent buffer overrun.
- This patch prevent potential buffer overrun in the code handling
  escape sequences.
2020-03-02 19:46:40 +01:00
Takashi Yano
10d8c2782d Cygwin: console: Fix setting/unsetting xterm mode for input.
- This patch fixes the issue that xterm compatible mode for input
  is not correctly set/unset in some situation such as:
   1) cat is stopped by ctrl-c.
   2) The window size is changed in less.
  In case 1), request_xterm_mode_input(true) is called in read(),
  however, cat is stopped without request_xterm_mode_input(false).
  In case 2), less uses longjmp in signal handler, therefore,
  corresponding request_xterm_mode_input(false) is not called if
  the SIGWINCH signal is sent within read(). With this patch,
  InterlockedExchange() is used instead of InterlockedIncrement/
  Decrement().
2020-03-02 19:46:40 +01:00
Takashi Yano
7f5051d766 Cygwin: console: Revise the code to fix tab position.
- This patch fixes the issue that the cursor position is broken if
  window size is changed while executing vim, less etc.
2020-03-02 19:46:40 +01:00
Takashi Yano
002206dc7c Cygwin: console: Adjust the detailed behaviour of ESC sequences.
- This patch makes some detailed behaviour of ESC sequences such as
  "CSI Ps L" (IL), "CSI Ps M" (DL) and "ESC M" (RI) in xterm mode
  match with real xterm.
2020-02-28 15:32:51 +01:00
Takashi Yano
c13cdfd00e Cygwin: console: Add emulation of CSI3J on Win10 1809.
- This patch add emulation of CSI3J, which is broken in Win10 1809,
  rather than ignoring it as before.
2020-02-26 21:17:36 +01:00
Takashi Yano
0d7bbc0bc3 Cygwin: console: Add support for REP escape sequence to xterm mode.
- In Win10 upto 1809, xterm compatible mode does not have REP
  escape sequence which terminfo declares. This patch adds support
  for "CSI Ps b" (REP). With this patch, bvi (binary editor) works
  normally in Win10 1809. Also, xterm compatible mode does not have
  "CSI Pm `" (HPA), "CSI Pm a" (HPR) and "CSI Ps e" (VPR). However,
  they do not appear to be declared by terminfo. Therefore, these
  have been pending.
2020-02-26 21:17:36 +01:00
Takashi Yano
3b42762e0b Cygwin: console: Unify workaround code for CSI3J and CSI?1049h/l.
- This patch unifies workaround code for CSI3J and CSI?1049h/l into
  the code handling other escape sequences in xterm mode.
2020-02-26 21:17:36 +01:00
Takashi Yano
7dfe04e933 Cygwin: console: Add workaround for broken IL/DL in xterm mode.
- Cygwin console with xterm compatible mode causes problem reported
  in https://www.cygwin.com/ml/cygwin-patches/2020-q1/msg00212.html
  if background/foreground colors are set to gray/black respectively
  in Win10 1903/1909. This is caused by "CSI Ps L" (IL), "CSI Ps M"
  (DL) and "ESC M" (RI) control sequences which are broken. This
  patch adds a workaround for the issue.
2020-02-26 21:17:36 +01:00
Takashi Yano
17528b9d2c Cygwin: console: Fix segfault on shared_console_info access.
- Accessing shared_console_info before initialization causes access
  violation because it is a NULL pointer. The cause of the problem
  reported in https://cygwin.com/ml/cygwin/2020-02/msg00197.html is
  this NULL pointer access in request_xterm_mode_output() when it is
  called from close(). This patch makes sure that shared_console_info
  is not NULL before calling request_xterm_mode_output().
2020-02-24 19:41:16 +01:00
Corinna Vinschen
db33f3499c Cygwin: don't move cursor on NUL char at all
Add a comment instead to explain that this behaviour contradicts
the terminfo entry.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2020-02-21 10:31:19 +01:00
Corinna Vinschen
4ec2e5e1c2 Cygwin: fhandler_console.cc: fix minor style issues
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2020-02-20 14:58:20 +01:00
Corinna Vinschen
c9f153580b Cygwin: console: ignore NUL byte on write in xterm emulation mode as well
A NUL byte in the output stream got accidentally not handled as IGN char
in xterm console mode.  The internal mbtowc conversion doesn't handle
embedded NUL values gracefully, it always stops converting at NUL bytes.
This broke the output of strings with embedded NUL bytes.

Fix this by always skipping IGN chars in the "normal char output loop"
and make sure not to move the cursor one position to the right, as in
legacy console mode.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2020-02-20 14:58:16 +01:00
Takashi Yano
81b3440998 Cygwin: console: Add guard for set/unset xterm compatible mode.
- Setting / unsetting xterm compatible mode may cause race issue
  between multiple processes. This patch adds guard for that.
2020-02-18 11:35:42 +01:00