diff options
Diffstat (limited to 'winsup/cygwin/fhandler_console.cc')
-rw-r--r-- | winsup/cygwin/fhandler_console.cc | 51 |
1 files changed, 44 insertions, 7 deletions
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index 4ab9bca..64e12b8 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -2053,6 +2053,19 @@ fhandler_console::char_command (char c) { /* Use "CSI Ps T" instead */ cursor_get (&x, &y); + if (y < srTop || y > srBottom) + break; + if (y == con.b.srWindow.Top + && srBottom == con.b.srWindow.Bottom) + { + /* Erase scroll down area */ + n = con.args[0] ? : 1; + __small_sprintf (buf, "\033[%d;1H\033[J\033[%d;%dH", + srBottom - (n-1) - con.b.srWindow.Top + 1, + y + 1 - con.b.srWindow.Top, x + 1); + WriteConsoleA (get_output_handle (), + buf, strlen (buf), &wn, 0); + } __small_sprintf (buf, "\033[%d;%dr", y + 1 - con.b.srWindow.Top, srBottom + 1 - con.b.srWindow.Top); @@ -2079,6 +2092,8 @@ fhandler_console::char_command (char c) { /* Use "CSI Ps S" instead */ cursor_get (&x, &y); + if (y < srTop || y > srBottom) + break; __small_sprintf (buf, "\033[%d;%dr", y + 1 - con.b.srWindow.Top, srBottom + 1 - con.b.srWindow.Top); @@ -2137,6 +2152,16 @@ fhandler_console::char_command (char c) fix_tab_position (); } break; + case 'p': + if (con.saw_exclamation_mark) /* DECSTR Soft reset */ + { + con.scroll_region.Top = 0; + con.scroll_region.Bottom = -1; + } + wpbuf_put (c); + /* Just send the sequence */ + WriteConsoleA (get_output_handle (), wpbuf, wpixput, &wn, 0); + break; default: /* Other escape sequences */ wpbuf_put (c); @@ -2970,6 +2995,7 @@ fhandler_console::write (const void *vsrc, size_t len) con.saw_question_mark = false; con.saw_greater_than_sign = false; con.saw_space = false; + con.saw_exclamation_mark = false; } else if (wincap.has_con_24bit_colors () && !con_is_legacy && wincap.has_con_broken_il_dl () && *src == 'M') @@ -2979,13 +3005,17 @@ fhandler_console::write (const void *vsrc, size_t len) cursor_get (&x, &y); if (y == srTop) { - /* Erase scroll down area */ - char buf[] = "\033[32768;1H\033[J\033[32768;32768"; - __small_sprintf (buf, "\033[%d;1H\033[J\033[%d;%dH", - srBottom - con.b.srWindow.Top + 1, - y + 1 - con.b.srWindow.Top, x + 1); - WriteConsoleA (get_output_handle (), - buf, strlen (buf), &n, 0); + if (y == con.b.srWindow.Top + && srBottom == con.b.srWindow.Bottom) + { + /* Erase scroll down area */ + char buf[] = "\033[32768;1H\033[J\033[32768;32768"; + __small_sprintf (buf, "\033[%d;1H\033[J\033[%d;%dH", + srBottom - con.b.srWindow.Top + 1, + y + 1 - con.b.srWindow.Top, x + 1); + WriteConsoleA (get_output_handle (), + buf, strlen (buf), &n, 0); + } /* Substitute "CSI Ps T" */ wpbuf_put ('['); wpbuf_put ('T'); @@ -2998,6 +3028,11 @@ fhandler_console::write (const void *vsrc, size_t len) } else if (wincap.has_con_24bit_colors () && !con_is_legacy) { /* Only CSI is handled in xterm compatible mode. */ + if (*src == 'c') /* RIS Full reset */ + { + con.scroll_region.Top = 0; + con.scroll_region.Bottom = -1; + } wpbuf_put (*src); /* Just send the sequence */ DWORD n; @@ -3169,6 +3204,8 @@ fhandler_console::write (const void *vsrc, size_t len) con.saw_question_mark = true; else if (*src == '>') con.saw_greater_than_sign = true; + else if (*src == '!') + con.saw_exclamation_mark = true; wpbuf_put (*src); /* ignore any extra chars between [ and first arg or command */ src++; |