diff options
author | Thomas Wolff <towo@towo.net> | 2016-03-16 10:25:16 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2016-03-16 10:25:34 +0100 |
commit | 734656818aa571c8f0d8d3e73e391c8ae26d79f1 (patch) | |
tree | ff21e4c2ddb995fbe187304f9962396f16ee6e7d /winsup/cygwin/fhandler_console.cc | |
parent | e8e379ff1d8c7a018f327f89ff3528213920f56f (diff) | |
download | cygnal-734656818aa571c8f0d8d3e73e391c8ae26d79f1.tar.gz cygnal-734656818aa571c8f0d8d3e73e391c8ae26d79f1.tar.bz2 cygnal-734656818aa571c8f0d8d3e73e391c8ae26d79f1.zip |
Make requested console reports work
cf https://cygwin.com/ml/cygwin-patches/2012-q3/msg00019.html
This enables the following ESC sequences:
ESC[c sends primary device attributes
ESC[>c sends secondary device attributes
ESC[6n sends cursor position report
* fhandler.h (class dev_console): Add console read-ahead buffer.
(class fhandler_console): Add peek function for it (for select).
* fhandler_console.cc (fhandler_console::setup): Init buffer.
(fhandler_console::read): Check console read-aheader buffer.
(fhandler_console::char_command): Put responses to terminal
requests (device status and cursor position reports) into
common console buffer (shared between CONOUT/CONIN)
instead of fhandler buffer (separated).
* select.cc (peek_console): Check console read-ahead buffer.
Diffstat (limited to 'winsup/cygwin/fhandler_console.cc')
-rw-r--r-- | winsup/cygwin/fhandler_console.cc | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index a52449ea6..ef2d1c5a3 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -196,6 +196,7 @@ fhandler_console::setup () con.meta_mask |= RIGHT_ALT_PRESSED; con.set_default_attr (); con.backspace_keycode = CERASE; + con.cons_rapoi = NULL; shared_console_info->tty_min_state.is_console = true; } } @@ -310,6 +311,14 @@ fhandler_console::read (void *pv, size_t& buflen) int ch; set_input_state (); + /* Check console read-ahead buffer filled from terminal requests */ + if (con.cons_rapoi && *con.cons_rapoi) + { + *buf = *con.cons_rapoi++; + buflen = 1; + return; + } + int copied_chars = get_readahead_into_buffer (buf, buflen); if (copied_chars) @@ -1899,8 +1908,11 @@ fhandler_console::char_command (char c) strcpy (buf, "\033[?6c"); /* The generated report needs to be injected for read-ahead into the fhandler_console object associated with standard input. - The current call does not work. */ - puts_readahead (buf); + So puts_readahead does not work. + Use a common console read-ahead buffer instead. */ + con.cons_rapoi = NULL; + strcpy (con.cons_rabuf, buf); + con.cons_rapoi = con.cons_rabuf; break; case 'n': switch (con.args[0]) @@ -1910,9 +1922,11 @@ fhandler_console::char_command (char c) y -= con.b.srWindow.Top; /* x -= con.b.srWindow.Left; // not available yet */ __small_sprintf (buf, "\033[%d;%dR", y + 1, x + 1); - puts_readahead (buf); + con.cons_rapoi = NULL; + strcpy (con.cons_rabuf, buf); + con.cons_rapoi = con.cons_rabuf; break; - default: + default: goto bad_escape; } break; |