diff -rup sav/fhandler.h ./fhandler.h --- sav/fhandler.h 2012-08-03 17:39:21.000000000 +0200 +++ ./fhandler.h 2012-08-15 16:57:09.152522000 +0200 @@ -1294,6 +1294,8 @@ class dev_console bool ext_mouse_mode15; bool use_focus; bool raw_win32_keyboard_mode; + char cons_rabuf[40]; + char * cons_rapoi; inline UINT get_console_cp (); DWORD con_to_str (char *d, int dlen, WCHAR w); @@ -1384,6 +1386,7 @@ private: int init (HANDLE, DWORD, mode_t); bool mouse_aware (MOUSE_EVENT_RECORD& mouse_event); bool focus_aware () {return shared_console_info->dev_state.use_focus;} + bool get_cons_readahead_valid () { return shared_console_info->dev_state.cons_rapoi != 0; } select_record *select_read (select_stuff *); select_record *select_write (select_stuff *); diff -rup sav/fhandler_console.cc ./fhandler_console.cc --- sav/fhandler_console.cc 2012-07-30 05:44:59.000000000 +0200 +++ ./fhandler_console.cc 2012-08-15 18:44:27.603635900 +0200 @@ -95,6 +95,7 @@ fhandler_console::open_shared_console (H create = m != SH_JUSTOPEN; return res; } + class console_unit { int n; @@ -142,6 +143,7 @@ fhandler_console::set_unit () HWND me; fh_devices this_unit = dev (); bool generic_console = this_unit == FH_CONIN || this_unit == FH_CONOUT; + if (shared_console_info) { fh_devices shared_unit = @@ -183,7 +185,6 @@ fhandler_console::setup () { if (set_unit ()) { - dev_state.scroll_region.Bottom = -1; dev_state.dwLastCursorPosition.X = -1; dev_state.dwLastCursorPosition.Y = -1; @@ -207,6 +208,7 @@ fhandler_console::setup () dev_state.meta_mask |= RIGHT_ALT_PRESSED; dev_state.set_default_attr (); dev_state.backspace_keycode = CERASE; + dev_state.cons_rapoi = 0; shared_console_info->tty_min_state.is_console = true; } } @@ -330,6 +332,14 @@ fhandler_console::read (void *pv, size_t int ch; set_input_state (); + /* Check console read-ahead buffer filled from terminal requests */ + if (dev_state.cons_rapoi && * dev_state.cons_rapoi) + { + * buf = * dev_state.cons_rapoi ++; + buflen = 1; + return; + } + int copied_chars = get_readahead_into_buffer (buf, buflen); if (copied_chars) @@ -726,6 +736,7 @@ fhandler_console::read (void *pv, size_t buf[copied_chars++] = (unsigned char)(ch & 0xff); buflen--; } + #undef buf buflen = copied_chars; @@ -1739,8 +1750,12 @@ 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. */ + /*puts_readahead (buf);*/ + /* Use a common console read-ahead buffer instead. */ + dev_state.cons_rapoi = 0; + strcpy (dev_state.cons_rabuf, buf); + dev_state.cons_rapoi = dev_state.cons_rabuf; break; case 'n': switch (dev_state.args_[0]) @@ -1750,9 +1765,12 @@ fhandler_console::char_command (char c) y -= dev_state.info.winTop; /* x -= dev_state.info.winLeft; // not available yet */ __small_sprintf (buf, "\033[%d;%dR", y + 1, x + 1); - puts_readahead (buf); + /*puts_readahead (buf);*/ + dev_state.cons_rapoi = 0; + strcpy (dev_state.cons_rabuf, buf); + dev_state.cons_rapoi = dev_state.cons_rabuf; break; - default: + default: goto bad_escape; } break; diff -rup sav/select.cc ./select.cc --- sav/select.cc 2012-07-24 16:03:54.000000000 +0200 +++ ./select.cc 2012-08-15 18:38:32.119260900 +0200 @@ -818,6 +818,11 @@ peek_console (select_record *me, bool) if (!me->read_selected) return me->write_ready; + if (fh->get_cons_readahead_valid ()) + { + select_printf ("cons_readahead"); + return me->read_ready = true; + } if (fh->get_readahead_valid ()) { select_printf ("readahead");