--- fhandler_console.cc Tue Oct 17 11:31:17 2000 +++ fhandler_console.cc.mine Tue Oct 17 10:49:13 2000 @@ -370,7 +370,7 @@ set_r_no_interrupt (1); // Handled explicitly in read code h = CreateFileA ("CONOUT$", GENERIC_READ|GENERIC_WRITE, - FILE_SHARE_WRITE | FILE_SHARE_WRITE, &sec_none, + FILE_SHARE_READ | FILE_SHARE_WRITE, &sec_none, OPEN_EXISTING, 0, 0); if (h == INVALID_HANDLE_VALUE) @@ -630,6 +630,7 @@ { set_cb (sizeof *this); state_ = normal; + altfont_ = 0; set_need_fork_fixup (); } @@ -775,13 +776,16 @@ void fhandler_console::char_command (char c) { - // Keep the background intensity with the colr since there doesn't seem - // to be a way to set this with termcap/terminfo. static int fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED), bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN | - BACKGROUND_RED | BACKGROUND_INTENSITY), - bold = default_color & FOREGROUND_INTENSITY; + BACKGROUND_RED); + + static bool bold = (default_color & FOREGROUND_INTENSITY) ? true : false; + static bool underline = (default_color & BACKGROUND_INTENSITY) ? true : false; + static bool reverse = false; + static bool invis = false; + int x, y; char buf[40]; @@ -793,60 +797,46 @@ for (i = 0; i <= nargs_; i++) switch (args_[i]) { - case 0: /* normal color */ + case 0: /* default rendition */ fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED); bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN | - BACKGROUND_RED | BACKGROUND_INTENSITY); - bold = default_color & FOREGROUND_INTENSITY; + BACKGROUND_RED); + underline = (default_color & BACKGROUND_INTENSITY) ? true : false; + reverse = false; + bold = (default_color & FOREGROUND_INTENSITY) ? true : false; + invis = false; + altfont_ = 0; break; case 1: /* bold */ - fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN | - FOREGROUND_RED); - bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN | - BACKGROUND_RED | BACKGROUND_INTENSITY); - bold = FOREGROUND_INTENSITY; + bold = true; break; - case 4: /* underline - simulate with cyan */ - fg = FOREGROUND_BLUE | FOREGROUND_GREEN; - bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN | - BACKGROUND_RED | BACKGROUND_INTENSITY); - bold = default_color & FOREGROUND_INTENSITY; - break; - case 5: /* blink mode */ - fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN | - FOREGROUND_RED); - bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN | - BACKGROUND_RED | BACKGROUND_INTENSITY); - bold = default_color & FOREGROUND_INTENSITY; + case 4: /* underline */ + underline = true; break; case 7: /* reverse */ - fg = (default_color & BACKGROUND_BLUE) ? FOREGROUND_BLUE : 0; - fg |= (default_color & BACKGROUND_GREEN) ? FOREGROUND_GREEN : 0; - fg |= (default_color & BACKGROUND_RED) ? FOREGROUND_RED : 0; - fg |= (default_color & BACKGROUND_INTENSITY) ? - FOREGROUND_INTENSITY : 0; - bg = (default_color & FOREGROUND_BLUE) ? BACKGROUND_BLUE : 0; - bg |= (default_color & FOREGROUND_GREEN) ? BACKGROUND_GREEN : 0; - bg |= (default_color & FOREGROUND_RED) ? BACKGROUND_RED : 0; - bg |= (default_color & FOREGROUND_INTENSITY) ? - BACKGROUND_INTENSITY : 0; + reverse = true; break; case 8: /* invisible */ - fg = (default_color & BACKGROUND_BLUE) ? FOREGROUND_BLUE : 0; - fg |= (default_color & BACKGROUND_GREEN) ? FOREGROUND_GREEN : 0; - fg |= (default_color & BACKGROUND_RED) ? FOREGROUND_RED : 0; - bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN | - BACKGROUND_RED | BACKGROUND_INTENSITY); - bold = (default_color & BACKGROUND_INTENSITY) ? - FOREGROUND_INTENSITY : 0; + invis = true; break; - case 9: /* dim */ - fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN | - FOREGROUND_RED); - bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN | - BACKGROUND_RED | BACKGROUND_INTENSITY); - bold = (fg == 0) ? FOREGROUND_INTENSITY : 0; + case 10: /* primary (default) font */ + altfont_ = 0; + break; + case 11: /* first alternative font */ + altfont_ = 1; + break; + case 22: /* non-bold */ + bold = false; + break; + case 24: /* non-underline */ + underline = false; + break; + case 27: /* non-reverse */ + reverse = false; + break; + case 28: /* non-invisible */ + invis = false; break; case 30: /* BLACK foreground */ fg = 0; @@ -872,6 +862,10 @@ case 37: /* WHITE foreg */ fg = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; break; + case 39: /* Default foreg */ + fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN | + FOREGROUND_RED); + break; case 40: /* BLACK background */ bg = 0; break; @@ -896,15 +890,39 @@ case 47: /* WHITE background */ bg = BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED; break; - default: - fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN | - FOREGROUND_RED); + case 49: /* Default background */ bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN | - BACKGROUND_RED | BACKGROUND_INTENSITY); - bold = default_color & FOREGROUND_INTENSITY; + BACKGROUND_RED); + break; + default: break; } - SetConsoleTextAttribute (get_output_handle (), fg | bg | bold); + + { + WORD fg2 = fg; + WORD bg2 = bg; + + if (reverse) { + fg2 = ((bg & BACKGROUND_RED) ? FOREGROUND_RED : 0) | + ((bg & BACKGROUND_GREEN) ? FOREGROUND_GREEN : 0) | + ((bg & BACKGROUND_BLUE) ? FOREGROUND_BLUE : 0); + bg2 = ((fg & FOREGROUND_RED) ? BACKGROUND_RED : 0) | + ((fg & FOREGROUND_GREEN) ? BACKGROUND_GREEN : 0) | + ((fg & FOREGROUND_BLUE) ? BACKGROUND_BLUE : 0); + } + + if (bold) fg2 |= FOREGROUND_INTENSITY; + if (underline) bg2 |= BACKGROUND_INTENSITY; + if (invis) { + fg2 = ((bg2 & BACKGROUND_RED) ? FOREGROUND_RED : 0) | + ((bg2 & BACKGROUND_GREEN) ? FOREGROUND_GREEN : 0) | + ((bg2 & BACKGROUND_BLUE) ? FOREGROUND_BLUE : 0) | + ((bg2 & BACKGROUND_INTENSITY) ? FOREGROUND_INTENSITY : 0); + } + + SetConsoleTextAttribute (get_output_handle (), fg2 | bg2); + } + break; case 'h': case 'l': @@ -1079,7 +1097,10 @@ size_t len = found - src; do { size_t l2 = min (sizeof (buf), len); - CharToOemBuff ((LPCSTR)src, buf, l2); + if (altfont_ == 0) + CharToOemBuff ((LPCSTR)src, buf, l2); + else + strncpy(buf, (const char *)src, l2); if (! WriteFile (get_output_handle (), buf, l2, &done, 0)) { debug_printf ("write failed, handle %p", get_output_handle ());