Index: fhandler.h =================================================================== RCS file: /cvs/src/src/winsup/cygwin/fhandler.h,v retrieving revision 1.162 diff -u -p -r1.162 fhandler.h --- fhandler.h 12 May 2003 11:06:25 -0000 1.162 +++ fhandler.h 21 May 2003 14:14:39 -0000 @@ -754,7 +754,9 @@ class dev_console unsigned rarg; bool saw_question_mark; + unsigned char cursor_eob_flag; + DWORD cursor_eob_mode; WORD current_win32_attr; ansi_intensity intensity; Index: fhandler_console.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/fhandler_console.cc,v retrieving revision 1.110 diff -u -p -r1.110 fhandler_console.cc --- fhandler_console.cc 8 Apr 2003 21:19:33 -0000 1.110 +++ fhandler_console.cc 21 May 2003 14:14:41 -0000 @@ -1392,10 +1422,15 @@ fhandler_console::write_normal (const un if (found != src) { DWORD len = found - src; + debug_printf("writing %d characters first=%d(%c)", len, *src, isprint(*src) ? *src : 32); do { DWORD buf_len; char buf[CONVERT_LIMIT]; + int x, y; + + cursor_get (&x, &y); + done = buf_len = min (sizeof (buf), len); if (!str_to_con (buf, (const char *) src, buf_len)) { @@ -1407,11 +1442,37 @@ fhandler_console::write_normal (const un if (dev_state->insert_mode) { - int x, y; - cursor_get (&x, &y); scroll_screen (x, y, -1, y, x + buf_len, y); } + + /* about to scroll? */ + if (x + ((signed)buf_len) == dev_state->info.dwBufferSize.X && + y + 1 == dev_state->info.dwBufferSize.Y) + { + debug_printf ("end of buffer reached, disable WRAP EOL"); + dev_state->cursor_eob_flag = 1; + GetConsoleMode(get_output_handle(), &dev_state->cursor_eob_mode); + SetConsoleMode(get_output_handle(), dev_state->cursor_eob_mode & ~ENABLE_WRAP_AT_EOL_OUTPUT); + } + else + if (dev_state->cursor_eob_flag == 1) + { + debug_printf ("leave end of buffer state, restore WRAP EOL"); + dev_state->cursor_eob_flag = 0; + SetConsoleMode(get_output_handle(), dev_state->cursor_eob_mode); + /* cursor pos still at end of buffer? then scroll on! */ + if (x + 1 == dev_state->info.dwBufferSize.X && y + 1 == dev_state->info.dwBufferSize.Y) + { + unsigned char c[2]; + DWORD len; + + c[0] = '\r'; + c[1] = '\n'; + WriteFile(get_output_handle(), c, 2, &len, NULL); + } + } + if (!WriteFile (get_output_handle (), buf, buf_len, &done, 0)) { debug_printf ("write failed, handle %p", get_output_handle ());