[PATCH v2 1/4] Cygwin: console: Add workaround for broken IL/DL in xterm mode.
Jon Turney
jon.turney@dronecode.org.uk
Thu Feb 27 18:03:00 GMT 2020
On 26/02/2020 15:32, Takashi Yano wrote:
> - 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.
> ---
> winsup/cygwin/fhandler_console.cc | 156 +++++++++++++++++++++++++++++-
> winsup/cygwin/wincap.cc | 10 ++
> winsup/cygwin/wincap.h | 2 +
> 3 files changed, 166 insertions(+), 2 deletions(-)
>
> diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
> index 328424a7d..c2198ea1e 100644
> --- a/winsup/cygwin/fhandler_console.cc
> +++ b/winsup/cygwin/fhandler_console.cc
> @@ -57,6 +57,16 @@ bool NO_COPY fhandler_console::invisible_console;
> Only one console can exist in a process, therefore, static is suitable. */
> static struct fhandler_base::rabuf_t con_ra;
>
> +/* Write pending buffer for ESC sequence handling
> + in xterm compatible mode */
> +#define WPBUF_LEN 256
> +static unsigned char wpbuf[WPBUF_LEN];
> +static int wpixput;
> +#define wpbuf_put(x) \
> + wpbuf[wpixput++] = x; \
> + if (wpixput > WPBUF_LEN) \
> + wpixput--;
> +
> static void
> beep ()
[...]
> + }
> + else
> + wpbuf_put (*src);
> + WriteConsoleA (get_output_handle (), wpbuf, wpixput, &n, 0);
> + con.state = normal;
> + wpixput = 0;
> + }
This generates a (useful!) warning with gcc 9.2.0:
> ../../../../winsup/cygwin/fhandler_console.cc: In member function 'virtual ssize_t fhandler_console::write(const void*, size_t)':
> ../../../../winsup/cygwin/fhandler_console.cc:67:3: error: macro expands to multiple statements [-Werror=multistatement-macros]
> 67 | wpbuf[wpixput++] = x; \
> | ^~~~~
> ../../../../winsup/cygwin/fhandler_console.cc:67:3: note: in definition of macro 'wpbuf_put'
> 67 | wpbuf[wpixput++] = x; \
> | ^~~~~
> ../../../../winsup/cygwin/fhandler_console.cc:2993:8: note: some parts of macro expansion are not guarded by this 'else' clause
> 2993 | else
> | ^~~~
So I think either the macro need it contents contained by a 'do { ... }
while(0)', or that instance of it needs to be surrounded by braces, to
do what you intend.
More information about the Cygwin-patches
mailing list