1 | $Id: NOTES 281 2003-12-25 21:28:55Z sam $ |
---|
2 | |
---|
3 | o Colour does not work with all backends and all terminals. I tested |
---|
4 | many terminal emulators and tried to summarise which combinations |
---|
5 | worked properly and which ones did not. |
---|
6 | |
---|
7 | From termcap(5): |
---|
8 | |
---|
9 | set_a_background setab AB Set background |
---|
10 | color to #1, using |
---|
11 | ANSI escape |
---|
12 | set_a_foreground setaf AF Set foreground |
---|
13 | color to #1, using |
---|
14 | ANSI escape |
---|
15 | From the xterm terminfo: |
---|
16 | |
---|
17 | setab=\E[4%p1%dm, setaf=\E[3%p1%dm |
---|
18 | |
---|
19 | From the xterm-16color terminfo: |
---|
20 | (http://www.sct.gu.edu.au/~anthony/info/X/Xterm_xf86.terminfo) |
---|
21 | |
---|
22 | setab=\E[%?%p1%{8}%<%t%p1%{40}%+%e%p1%{92}%+%;%dm, |
---|
23 | setaf=\E[%?%p1%{8}%<%t%p1%{30}%+%e%p1%{82}%+%;%dm, |
---|
24 | |
---|
25 | These values can be simply retrieved with a tigetstr() call. |
---|
26 | |
---|
27 | o I tested the following terminals: |
---|
28 | |
---|
29 | name $TERM $COLORTERM |
---|
30 | ------------------------------------------ |
---|
31 | Linux console linux |
---|
32 | pterm xterm |
---|
33 | aterm xterm rxvt-xpm |
---|
34 | wterm xterm wterm-xpm |
---|
35 | Eterm xterm Eterm |
---|
36 | xterm xterm |
---|
37 | gnome-terminal xterm |
---|
38 | konsole xterm |
---|
39 | mlterm mlterm |
---|
40 | uxterm xterm |
---|
41 | |
---|
42 | o In most terminals, \e[3xm and \[4xm respectively set the foreground |
---|
43 | and background colours. x is a colour between 0 and 7 or the value |
---|
44 | 9 for default colour (may be transparent). |
---|
45 | |
---|
46 | \e[0m sets everything to normal, \e[1m sets bold, \e[5m sets blink |
---|
47 | and \e[7m sets inverse video. |
---|
48 | |
---|
49 | In ncurses, only 64 colour pairs are created, and A_BOLD (\e[1m) and |
---|
50 | A_BLINK (\e[5m) are used for foreground/background colour highlighting, |
---|
51 | hence creating 256 possible colour pairs. |
---|
52 | |
---|
53 | Different tests of blue on yellow: |
---|
54 | |
---|
55 | for invert in '' '\e[7m'; do |
---|
56 | for blink in '' '\e[5m'; do |
---|
57 | for bold in '' '\e[1m'; do |
---|
58 | echo -ne "$bold$blink$invert"'\e[33m\e[44m'hop'\e[0m ' |
---|
59 | echo "($bold$blink$invert)" |
---|
60 | done |
---|
61 | done |
---|
62 | done |
---|
63 | |
---|
64 | Successfully works on: |
---|
65 | + Linux console |
---|
66 | + pterm |
---|
67 | + Eterm |
---|
68 | + aterm, wterm, rxvt |
---|
69 | |
---|
70 | Almost works on: |
---|
71 | + xterm (bright bg only works when fg is bright and then inverted, |
---|
72 | but then fg is not bright) |
---|
73 | |
---|
74 | Fails on: |
---|
75 | + mlterm (no bright colours, neither fg nor bg) |
---|
76 | + gnome-terminal (no bright bg) |
---|
77 | + konsole (no bright bg, $blink really blinks) |
---|
78 | |
---|
79 | o In an XTerm-compatible terminal, \e[9xm sets bright foreground |
---|
80 | and \e[10xm bright background colours. Documentation on this can be |
---|
81 | found at http://ftp.xfree86.org/pub/XFree86/4.2.1/doc/ctlseqs.TXT . |
---|
82 | Unfortunately all terminals don't support these escape sequences. Here |
---|
83 | is a testcase: |
---|
84 | |
---|
85 | for fgpre in 3 9; do for fg in 0 4 2 6 1 5 3 7; do |
---|
86 | for bgpre in 4 10; do |
---|
87 | echo -ne '\e['$fgpre$fg'm' |
---|
88 | for bg in 0 4 2 6 1 5 3 7; do echo -ne '\e['$bgpre$bg'm# '; done |
---|
89 | echo -ne '\e[0m ' |
---|
90 | done |
---|
91 | echo '' |
---|
92 | done; echo ''; done |
---|
93 | |
---|
94 | Successfully tested on: |
---|
95 | + gnome-terminal |
---|
96 | + konsole |
---|
97 | + xterm |
---|
98 | + pterm |
---|
99 | |
---|
100 | Failed (\e[9x and \e[10x don't do anything) on: |
---|
101 | + Eterm |
---|
102 | + aterm, wterm, rxvt |
---|
103 | + mlterm |
---|
104 | + Linux console |
---|
105 | |
---|
106 | o How to draw bright colours on any terminal? |
---|
107 | |
---|
108 | '\e[93;104m' -> bright yellow on bright blue |
---|
109 | doesn't work on mlterm, gnome-terminal, konsole |
---|
110 | |
---|
111 | '\e[5;1;33;44m' -> bright yellow on bright blue |
---|
112 | doesn't work on mlterm, aterm/wterm/rxvt, Eterm, console |
---|
113 | |
---|
114 | '\e[5;1;33;44;93;104m' -> bright yellow on bright blue |
---|
115 | works on gnome-terminal, xterm, pterm, aterm/wterm/rxvt, console |
---|
116 | doesn't work on konsole |
---|
117 | |
---|
118 | o S-Lang: |
---|
119 | |
---|
120 | 256 character pairs are definable, but only 128 can be used. This is |
---|
121 | because slsmg.c's This_Color variable uses its 8th bit to indicate an |
---|
122 | alternate character set. Replacing a few 0x7F with 0xFF in sldisply.c |
---|
123 | works around the problem but gets rid of the alternate charset. |
---|
124 | |
---|
125 | We can work around this problem. See this usage grid: |
---|
126 | |
---|
127 | bg 1 1 1 1 1 1 |
---|
128 | fg 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 |
---|
129 | |
---|
130 | 0 (black) C C C C C C F B c c c c c c F |
---|
131 | 1 (blue) A h D h D i f C C h E h E k g |
---|
132 | 2 (green) A h D h i D f C h C E h k E g |
---|
133 | 3 (cyan) A D D i h h f C E E C k h h g |
---|
134 | 4 (red) A h h i D D f C h h k C E E g |
---|
135 | 5 (magenta) A D i h D h f C E k h E C h g |
---|
136 | 6 (brown) A i D h D h f C k E h E h C g |
---|
137 | 7 (light gray) A F a a a a a B C C C C C C B |
---|
138 | |
---|
139 | 8 (dark gray) A C C C C C C B d d d d d d F |
---|
140 | 9 (light blue) A C h E h E j C e h D h D l C |
---|
141 | 10 (light green) A h C E h j E C e h D h l D C |
---|
142 | 11 (light cyan) A E E C j h h C e D D l h h C |
---|
143 | 12 (light red) A h h j C E E C e h h l D D C |
---|
144 | 13 (light magenta) A E j h E C h C e D l h D h C |
---|
145 | 14 (yellow) A j E h E h C C e l D h D h C |
---|
146 | 15 (white) A F b b b b b B F C C C C C C |
---|
147 | |
---|
148 | ' ': useless colour pairs that can be emulated by printing a space in |
---|
149 | any other colour pair that has the same background |
---|
150 | 'A': black background colour pairs that are needed for the old renderer |
---|
151 | 'B': gray combinations used for grayscale dithering |
---|
152 | 'C': white/light, light/dark, lightgray/light, darkgray/dark, dark/black |
---|
153 | combinations often used for saturation/value dithering (the two |
---|
154 | other possible combinations, lightgray/dark and darkgray/light, are |
---|
155 | not considered here) |
---|
156 | 'D': next colour combinations for hue dithering (magenta/blue, blue/green |
---|
157 | and so on) |
---|
158 | 'E': next colour combinations for hue/value dithering (blue/lightgreen, |
---|
159 | green/lightblue and so on) |
---|
160 | 'F': black on light gray, black on white, white on dark gray, dark gray |
---|
161 | on white, white on blue, light gray on blue (chosen arbitrarily) |
---|
162 | |
---|
163 | 'A': 15 colour pairs |
---|
164 | 'A'+'B': 20 colour pairs |
---|
165 | 'A'+'B'+'C': 74 colour pairs |
---|
166 | 'A'+'B'+'C'+'D': 98 colour pairs |
---|
167 | 'A'+'B'+'C'+'D'+'E': 122 colour pairs |
---|
168 | 'A'+'B'+'C'+'D'+'E'+'F': 128 colour pairs |
---|
169 | |
---|
170 | The remaining slightly important colour pairs are: |
---|
171 | |
---|
172 | 'a': light gray on dark colour: emulate with light colour on dark colour |
---|
173 | 'b': white on dark colour: emulate with light gray on light colour |
---|
174 | 'c': black on light colour: emulate with dark gray on dark colour |
---|
175 | 'd': dark gray on light colour: emulate with dark colour on light colour |
---|
176 | 'e': light colour on dark gray: emulate with dark colour on dark gray |
---|
177 | 'f': dark colour on light gray: emulate with light colour on light gray |
---|
178 | 'g': dark colour on white: emulate with light colour on white |
---|
179 | |
---|
180 | And now the seldom used pairs: |
---|
181 | |
---|
182 | 'h': 120 degree hue pairs can be emulated as well; for instance blue on |
---|
183 | red can be emulated using magenta on red, and blue on green using |
---|
184 | cyan on green |
---|
185 | |
---|
186 | And the almost never used pairs: |
---|
187 | |
---|
188 | 'i': dark opposite on dark: emulate with dark opposite on black |
---|
189 | 'j': light opposite on dark: emulate with light opposite on black |
---|
190 | 'k': dark opposite on light: emulate with black on dark |
---|
191 | 'l': light opposite on light: emulate with white on light |
---|
192 | |
---|
193 | o MS-DOS: all bright colours, bright backgrounds, and bright combinations |
---|
194 | work using <conio.h>. No need to kludge anything. |
---|
195 | |
---|