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,11 @@ class dev_console unsigned rarg; bool saw_question_mark; + int prev_title_len; char my_title_buf [TITLESIZE + 1]; + + 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 @@ -78,8 +78,10 @@ str_to_con (char *d, const char *s, DWOR * Negative values represents current screen dimensions */ -#define srTop (dev_state->info.winTop + dev_state->scroll_region.Top) -#define srBottom ((dev_state->scroll_region.Bottom < 0) ? dev_state->info.winBottom : dev_state->info.winTop + dev_state->scroll_region.Bottom) +//#define srTop (dev_state->info.winTop + dev_state->scroll_region.Top) +//#define srBottom ((dev_state->scroll_region.Bottom < 0) ? dev_state->info.winBottom : dev_state->info.winTop + dev_state->scroll_region.Bottom) +#define srTop (dev_state->scroll_region.Top) +#define srBottom ((dev_state->scroll_region.Bottom < 0) ? dev_state->info.winBottom : dev_state->scroll_region.Bottom) #define use_tty ISSTATE (myself, PID_USETTY) @@ -112,6 +114,10 @@ fhandler_console::get_tty_stuff (int fla shared_console_info->tty_min_state.setsid (myself->sid); shared_console_info->tty_min_state.set_ctty (TTY_CONSOLE, flags); + GetConsoleTitle(dev_state->my_title_buf, TITLESIZE); + dev_state->prev_title_len = strlen(dev_state->my_title_buf); + strcpy(dev_state->my_title_buf+dev_state->prev_title_len, " | "); + dev_state->prev_title_len += 3; dev_state->scroll_region.Bottom = -1; dev_state->dwLastCursorPosition.X = -1; dev_state->dwLastCursorPosition.Y = -1; @@ -554,44 +560,59 @@ fhandler_console::fillin_info (void) void fhandler_console::scroll_screen (int x1, int y1, int x2, int y2, int xn, int yn) { - SMALL_RECT sr1, sr2; + SMALL_RECT srScroll, srClip; CHAR_INFO fill; COORD dest; (void) fillin_info (); - sr1.Left = x1 >= 0 ? x1 : dev_state->info.dwWinSize.X - 1; + srScroll.Left = x1 >= 0 ? x1 : dev_state->info.dwWinSize.X - 1; + srScroll.Right = x2 >= 0 ? x2 : dev_state->info.dwWinSize.X - 1; if (y1 == 0) - sr1.Top = dev_state->info.winTop; + srScroll.Top = dev_state->info.winTop; else - sr1.Top = y1 > 0 ? y1 : dev_state->info.winBottom; - sr1.Right = x2 >= 0 ? x2 : dev_state->info.dwWinSize.X - 1; + if (y1 < 0) + srScroll.Top = dev_state->info.winBottom; + else + srScroll.Top = y1; if (y2 == 0) - sr1.Bottom = dev_state->info.winTop; + srScroll.Bottom = dev_state->info.winTop; + else + if (y2 < 0) + srScroll.Bottom = dev_state->info.winBottom; else - sr1.Bottom = y2 > 0 ? y2 : dev_state->info.winBottom; - sr2.Top = srTop; - sr2.Left = 0; - sr2.Bottom = srBottom; - sr2.Right = dev_state->info.dwWinSize.X - 1; - if (sr1.Bottom > sr2.Bottom && sr1.Top <= sr2.Bottom) - sr1.Bottom = sr2.Bottom; + srScroll.Bottom = y2; + srClip.Top = srTop; + srClip.Left = 0; + srClip.Bottom = srBottom; + srClip.Right = dev_state->info.dwWinSize.X - 1; + if (srScroll.Top < srClip.Top && srScroll.Bottom >= srClip.Bottom) + srScroll.Top = srClip.Top; + if (srScroll.Bottom > srClip.Bottom && srScroll.Top <= srClip.Bottom) + srScroll.Bottom = srClip.Bottom; dest.X = xn >= 0 ? xn : dev_state->info.dwWinSize.X - 1; if (yn == 0) dest.Y = dev_state->info.winTop; else - dest.Y = yn > 0 ? yn : dev_state->info.winBottom; + if (yn < 0) + dest.Y = dev_state->info.winBottom; + else + dest.Y = yn; fill.Char.AsciiChar = ' '; fill.Attributes = dev_state->current_win32_attr; - ScrollConsoleScreenBuffer (get_output_handle (), &sr1, &sr2, dest, &fill); + + debug_printf("screen_scroll with parameters: ul=%d,%d br=%d,%d nul=%d,%d scroll=%d,%d;%d,%d clip=%d,%d;%d,%d dest=%d,%d", + x1,y1,x2,y2,xn,yn,srScroll.Left,srScroll.Top,srScroll.Right,srScroll.Bottom,srClip.Left,srClip.Top,srClip.Right,srClip.Bottom,dest.X,dest.Y); + + ScrollConsoleScreenBuffer (get_output_handle (), &srScroll, &srClip, dest, &fill); /* ScrollConsoleScreenBuffer on Windows 95 is buggy - when scroll distance * is more than half of screen, filling doesn't work as expected */ - if (sr1.Top != sr1.Bottom) - if (dest.Y <= sr1.Top) /* forward scroll */ - clear_screen (0, 1 + dest.Y + sr1.Bottom - sr1.Top, sr2.Right, sr2.Bottom); + if (srScroll.Top != srScroll.Bottom) + if (dest.Y <= srScroll.Top) /* forward scroll */ + clear_screen (0, 1 + dest.Y + srScroll.Bottom - srScroll.Top, srClip.Right, srClip.Bottom); else /* reverse scroll */ - clear_screen (0, sr1.Top, sr2.Right, dest.Y - 1); + clear_screen (0, srScroll.Top, srClip.Right, dest.Y - 1); } int @@ -1023,7 +1044,7 @@ static const char base_chars[256] = /*10 11 12 13 14 15 16 17 */ NOR, NOR, ERR, ERR, ERR, ERR, ERR, ERR, /*18 19 1A 1B 1C 1D 1E 1F */ NOR, NOR, ERR, ESC, ERR, ERR, ERR, ERR, /* ! " # $ % & ' */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*() * + , - . / */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, +/*( ) * + , - . / */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, /*0 1 2 3 4 5 6 7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, /*8 9 : ; < = > ? */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, /*@ A B C D E F G */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, @@ -1361,12 +1382,21 @@ fhandler_console::char_command (char c) } break; case 'r': /* Set Scroll region */ - dev_state->scroll_region.Top = dev_state->args_[0] ? dev_state->args_[0] - 1 : 0; - dev_state->scroll_region.Bottom = dev_state->args_[1] ? dev_state->args_[1] - 1 : -1; + fillin_info(); + dev_state->scroll_region.Top = dev_state->args_[0] ? dev_state->info.winTop + dev_state->args_[0] - 1 : 0; + dev_state->scroll_region.Bottom = dev_state->args_[1] ? dev_state->info.winTop + dev_state->args_[1] - 1 : -1; + debug_printf("setting scroll region to line: %d to %d (0 based)", + dev_state->scroll_region.Top, dev_state->scroll_region.Bottom); cursor_set (TRUE, 0, 0); break; case 'g': /* TAB set/clear */ break; + case 'y': + current_codepage = oem_cp; + break; + case 'z': + current_codepage = ansi_cp; + break; default: bad_escape: break; @@ -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 ()); @@ -1439,13 +1500,13 @@ fhandler_console::write_normal (const un cursor_get (&x, &y); if (y >= srBottom) { - if (y >= dev_state->info.winBottom && !dev_state->scroll_region.Top) - WriteFile (get_output_handle (), "\n", 1, &done, 0); - else - { +// if (y >= dev_state->info.winBottom && !dev_state->scroll_region.Top) +// WriteFile (get_output_handle (), "\n", 1, &done, 0); +// else +// { scroll_screen (0, srTop + 1, -1, srBottom, 0, srTop); y--; - } +// } } cursor_set (FALSE, ((tc->ti.c_oflag & ONLCR) ? 0 : x), y + 1); break; @@ -1483,7 +1544,7 @@ fhandler_console::write (const void *vsr while (src < end) { - debug_printf ("at %d(%c) state is %d", *src, isprint (*src) ? *src : ' ', + debug_printf ("at index=%2d char=%3d(%c) state=%d", src-((unsigned char*)vsrc), *src, isprint (*src) ? *src : 32, dev_state->state_); switch (dev_state->state_) { @@ -1504,7 +1565,8 @@ fhandler_console::write (const void *vsr else if (*src == ']') { dev_state->rarg = 0; - dev_state->my_title_buf[0] = '\0'; + dev_state->my_title_buf[dev_state->prev_title_len-3] = ' '; + dev_state->my_title_buf[dev_state->prev_title_len] = '\0'; dev_state->state_ = gotrsquare; } else if (*src == 'M') /* Reverse Index */ @@ -1578,6 +1640,12 @@ fhandler_console::write (const void *vsr { if (*src == '\007' && dev_state->state_ == gettitle) { + if (n == dev_state->prev_title_len) + { + /* 3 == length " | " */ + n -= 3; + dev_state->my_title_buf[n] = '\0'; + } if (old_title) strcpy (old_title, dev_state->my_title_buf); set_console_title (dev_state->my_title_buf);