Mailing-List: contact cygwin-help AT sourceware DOT cygnus DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT sourceware DOT cygnus DOT com Delivered-To: mailing list cygwin AT sourceware DOT cygnus DOT com X-Authentication-Warning: testprod.com: Host dyn1-tnt12-119.detroit.mi.ameritech.net [209.18.31.119] claimed to be btown1 From: "Bradley A. Town" To: Subject: [PATCH] fhandler_console.cc Date: Tue, 30 May 2000 16:27:49 -0400 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2911.0) Importance: Normal X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2919.6700 Below is an improved terminfo entry for cygwin and the patch to fhandler_console.cc it uses. They are especially useful if you have programs that depend on ncurses. The patch accomplishes the following: . It fixes standout, reverse, bold, underline, and invisible display modes for screen colors other than the default. . It treats underline as intense background. . It adds codes for turning off bold, underline, reverse, and invisible individually according to ECMA-48. . It adds codes for selecting the default foreground and default background according to ECMA-48. . It no longer modifies the current mode if an unknown SGR code is given. . It probably breaks someone's program somewhere. However, the patch and the terminfo entry have been tested with ncurses's test programs, tack, lynx, and frotz (the program that prompted this). The terminfo entry accomplishes the following: . It consolidates the individual settings into one entry. (You might not like that.) . It uses the capabilities added with the patch. . It adds some keycodes. . It, too, probably breaks something. My mailer will wrap the terminfo lines, so you'll have to fix that before trying it. Brad Town townba at pobox dot com ------ cut here ------ # Blink and dim are not implemented # ENQ (u9) / ACK (u8) may not work as expected cygwin|ansi emulation for cygwin32, acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j\331k\277l\332m\300n\ 305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\37 6, smso=\E[7m, rmso=\E[27m, smul=\E[4m, rmul=\E[24m, rev=\E[7m, bold=\E[1m, invis=\E[8m, sgr0=\E[m, sgr=\E[0%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7%t;8%;m, colors#8, ncv#0, pairs#64, it#8, op=\E[39;49m, setaf=\E[3%p1%dm, setab=\E[4%p1%dm, am, mir, msgr, xon, clear=\E[2J, cuu1=\E[A, cud1=\E[B, cuf1=\E[C, cub1=^H, cup=\E[%i%p1%d;%p2%dH, home=\E[H, is2=\E[m\E[?7h, pfkey=\E[0;%p1%{58}%+%d;%p2"%s", sc=\E[s, rc=\E[u, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?6c, u9=\E[c, el=\E[K, el1=\E[1K, ed=\E[J, cr=^M, ind=^J, ht=^I, bel=^G, kcuu1=\E[A, kcud1=\E[B, kcuf1=\E[C, kcub1=\E[D, ka1=\E[1~, ka3=\E[5~, kb2=\E[G, kc1=\E[4~, kc3=\E[6~, kdch1=\E[3~, kich1=\E[2~, khome=\E[1~, kend=\E[4~, kpp=\E[5~, knp=\E[6~, kf1=\E[[A, kf2=\E[[B, kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf20=\E[34~, ------ cut here ------ --- fhandler_console.cc.orig Sun May 14 12:20:24 2000 +++ fhandler_console.cc Tue May 30 15:42:42 2000 @@ -724,13 +724,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]; @@ -746,56 +749,35 @@ 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; 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 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; @@ -821,6 +803,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; @@ -845,15 +831,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; + 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': -- Want to unsubscribe from this list? Send a message to cygwin-unsubscribe AT sourceware DOT cygnus DOT com