From e548c131d8f64ea18a265e7c33dddb40c5384574 Mon Sep 17 00:00:00 2001 From: Takashi Yano Date: Thu, 15 Aug 2019 14:02:05 +0900 Subject: [PATCH] Cygwin: console: Fix workaround for horizontal tab position - The workaround commit 33a21904a702191cebf0e81b4deba2dfa10a406c does not work as expected if window size is changed while screen is alternated. Fixed. --- winsup/cygwin/fhandler_console.cc | 47 +++++++++++++++++++------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index 4afb7efb7..67638055e 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -319,6 +319,25 @@ fhandler_console::set_cursor_maybe () } } +/* Workaround for a bug of windows xterm compatible mode. */ +/* The horizontal tab positions are broken after resize. */ +static void +fix_tab_position (HANDLE h, SHORT width) +{ + char buf[2048] = {0,}; + /* Save cursor position */ + __small_sprintf (buf+strlen (buf), "\0337"); + /* Clear all horizontal tabs */ + __small_sprintf (buf+strlen (buf), "\033[3g"); + /* Set horizontal tabs */ + for (int col=8; colkill_pgrp (SIGWINCH); return true; } @@ -1615,6 +1617,12 @@ static const wchar_t __vt100_conv[31] = { inline bool fhandler_console::write_console (PWCHAR buf, DWORD len, DWORD& done) { + bool need_fix_tab_position = false; + /* Check if screen will be alternated. */ + if (wincap.has_con_24bit_colors () + && memmem (buf, len*sizeof (WCHAR), L"\033[?1049", 7*sizeof (WCHAR))) + need_fix_tab_position = true; + if (con.iso_2022_G1 ? con.vt100_graphics_mode_G1 : con.vt100_graphics_mode_G0) @@ -1633,6 +1641,9 @@ bool fhandler_console::write_console (PWCHAR buf, DWORD len, DWORD& done) len -= done; buf += done; } + /* Call fix_tab_position() if screen has been alternated. */ + if (need_fix_tab_position) + fix_tab_position (get_output_handle (), con.dwWinSize.X); return true; }