diff lisp/term/tty-colors.el @ 26736:a0674327c167

Changes for automatic remapping of X colors on terminal frames: * term/pc-win.el (msdos-setup-initial-frame): New function, run by term-setup-hook. Call msdos-remember-default-colors and msdos-handle-reverse-video. (msdos-face-setup): Parts of code moved to msdos-setup-initial-frame. (msdos-handle-reverse-video): New function, modeled after x-handle-reverse-video. (make-msdos-frame): Don't use initial-frame-alist and default-frame-alist. Call msdos-handle-reverse-video. (msdos-color-aliases): Remove. (msdos-color-translate, msdos-approximate-color): Remove. (msdos-color-values): Use 16-bit RGB values. RGB values updated for better approximation of X colors. (msdos-face-setup): Call tty-color-clear. Remove code that sets up tty-color-alist (it is now on startup.el). (x-display-color-p, x-color-defined-p, x-color-values, x-defined-colors, face-color-supported-p, face-color-gray-p): Remove. * facemenu.el (facemenu-read-color, list-colors-display): Use defined-colors for all frame types. (facemenu-color-equal): Use color-values for all frame types. * faces.el (read-face-attribute): For :foreground and :background attributes and frames on character terminals, translate the color to the closest supported one before looking it up in the list of valid values. (face-valid-attribute-values): Call defined-colors for all types of frames. (defined-colors, color-defined-p, color-values, display-color-p): New finctions. (x-defined-colors, x-color-defined-p, x-color-values, x-display-color-p): Aliases for the above. * startup.el (command-line): Register terminal colors for frame types other than x and w32, but only if the terminal supports colors. Call tty-color-define instead of face-register-tty-color. * term/x-win.el (xw-defined-colors): Renamed from x-defined-colors. * term/w32-win.el (xw-defined-colors): Likewise. * term/tty-colors.el: New file. * loadup.el: Load term/tty-colors.
author Eli Zaretskii <eliz@gnu.org>
date Mon, 06 Dec 1999 17:55:00 +0000
parents
children 5d4d3f1ba0cc
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/term/tty-colors.el	Mon Dec 06 17:55:00 1999 +0000
@@ -0,0 +1,938 @@
+;;; tty-color.el --- color support for character terminals
+
+;; Copyright (C) 1999 Free Software Foundation, Inc.
+
+;; Author: Eli Zaretskii <eliz@is.elta.co.il>
+;; Maintainer: FSF
+;; Keywords: terminals, faces
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Emacs support for colors evolved from the X Window System; color
+;; support for character-based terminals came later.  Many Lisp
+;; packages use color names defined by X and assume the availability
+;; of certain functions that look up colors, convert them to pixel
+;; values, etc.
+
+;; This file provides a more or less useful emulation of the X color
+;; functionality for character-based terminals, and thus relieves the
+;; rest of Emacs from including special code for this case.
+
+;; Here's how it works.  The support for terminal and MSDOS frames
+;; maintains an alist, called `tty-color-alist', which associates
+;; colors supported by the terminal driver with small integers.
+;; (These small integers are passed to the library functions which set
+;; the color, and are effectively indices of the colors in the
+;; supported color palette.)  When Emacs needs to send a color command
+;; to the terminal, the color name is first looked up in
+;; `tty-color-alist'.  If not found, functions from this file can be
+;; used to map the color to one of the supported colors.
+;; Specifically, the X RGB values of the requested color are extracted
+;; from `color-name-rgb-alist' and then the supported color is found
+;; with the minimal distance in the RGB space from the requested
+;; color.
+
+;; `tty-color-alist' is created at startup by calling the function
+;; `tty-color-define', defined below, passing it each supported color,
+;; its index, and its RGB values.  The standard list of colors
+;; supported by many Unix color terminals, including xterm, FreeBSD,
+;; and GNU/Linux, is supplied below in `tty-standard-colors'.  If your
+;; terminal supports different or additional colors, call
+;; `tty-color-define' from your `.emacs' or `site-start.el'.
+
+;;; Code:
+
+(defvar color-name-rgb-alist
+  '(("snow"		255 250 250)
+    ("ghostwhite"	248 248 255)
+    ("whitesmoke"	245 245 245)
+    ("gainsboro"	220 220 220)
+    ("floralwhite"	255 250 240)
+    ("oldlace"		253 245 230)
+    ("linen"		250 240 230)
+    ("antiquewhite"	250 235 215)
+    ("papayawhip"	255 239 213)
+    ("blanchedalmond"	255 235 205)
+    ("bisque"		255 228 196)
+    ("peachpuff"	255 218 185)
+    ("navajowhite"	255 222 173)
+    ("moccasin"		255 228 181)
+    ("cornsilk"		255 248 220)
+    ("ivory"		255 255 240)
+    ("lemonchiffon"	255 250 205)
+    ("seashell"		255 245 238)
+    ("honeydew"		240 255 240)
+    ("mintcream"	245 255 250)
+    ("azure"		240 255 255)
+    ("aliceblue"	240 248 255)
+    ("lavender"		230 230 250)
+    ("lavenderblush"	255 240 245)
+    ("mistyrose"	255 228 225)
+    ("white"		255 255 255)
+    ("black"		0 0 0)
+    ("darkslategray"	47 79 79)
+    ("darkslategrey"	47 79 79)
+    ("dimgray"		105 105 105)
+    ("dimgrey"		105 105 105)
+    ("slategray"	112 128 144)
+    ("slategrey"	112 128 144)
+    ("lightslategray"	119 136 153)
+    ("lightslategrey"	119 136 153)
+    ("gray"		190 190 190)
+    ("grey"		190 190 190)
+    ("lightgrey"	211 211 211)
+    ("lightgray"	211 211 211)
+    ("midnightblue"	25 25 112)
+    ("navy"		0 0 128)
+    ("navyblue"		0 0 128)
+    ("cornflowerblue"	100 149 237)
+    ("darkslateblue"	72 61 139)
+    ("slateblue"	106 90 205)
+    ("mediumslateblue"	123 104 238)
+    ("lightslateblue"	132 112 255)
+    ("mediumblue"	0 0 205)
+    ("royalblue"	65 105 225)
+    ("blue"		0 0 255)
+    ("dodgerblue"	30 144 255)
+    ("deepskyblue"	0 191 255)
+    ("skyblue"		135 206 235)
+    ("lightskyblue"	135 206 250)
+    ("steelblue"	70 130 180)
+    ("lightsteelblue"	176 196 222)
+    ("lightblue"	173 216 230)
+    ("powderblue"	176 224 230)
+    ("paleturquoise"	175 238 238)
+    ("darkturquoise"	0 206 209)
+    ("mediumturquoise"	72 209 204)
+    ("turquoise"	64 224 208)
+    ("cyan"		0 255 255)
+    ("lightcyan"	224 255 255)
+    ("cadetblue"	95 158 160)
+    ("mediumaquamarine"	102 205 170)
+    ("aquamarine"	127 255 212)
+    ("darkgreen"	0 100 0)
+    ("darkolivegreen"	85 107 47)
+    ("darkseagreen"	143 188 143)
+    ("seagreen"		46 139 87)
+    ("mediumseagreen"	60 179 113)
+    ("lightseagreen"	32 178 170)
+    ("palegreen"	152 251 152)
+    ("springgreen"	0 255 127)
+    ("lawngreen"	124 252 0)
+    ("green"		0 255 0)
+    ("chartreuse"	127 255 0)
+    ("mediumspringgreen"	0 250 154)
+    ("greenyellow"	173 255 47)
+    ("limegreen"	50 205 50)
+    ("yellowgreen"	154 205 50)
+    ("forestgreen"	34 139 34)
+    ("olivedrab"	107 142 35)
+    ("darkkhaki"	189 183 107)
+    ("khaki"		240 230 140)
+    ("palegoldenrod"	238 232 170)
+    ("lightgoldenrodyellow"	250 250 210)
+    ("lightyellow"	255 255 224)
+    ("yellow"		255 255 0)
+    ("gold"		255 215 0)
+    ("lightgoldenrod"	238 221 130)
+    ("goldenrod"	218 165 32)
+    ("darkgoldenrod"	184 134 11)
+    ("rosybrown"	188 143 143)
+    ("indianred"	205 92 92)
+    ("saddlebrown"	139 69 19)
+    ("sienna"		160 82 45)
+    ("peru"		205 133 63)
+    ("burlywood"	222 184 135)
+    ("beige"		245 245 220)
+    ("wheat"		245 222 179)
+    ("sandybrown"	244 164 96)
+    ("tan"		210 180 140)
+    ("chocolate"	210 105 30)
+    ("firebrick"	178 34 34)
+    ("brown"		165 42 42)
+    ("darksalmon"	233 150 122)
+    ("salmon"		250 128 114)
+    ("lightsalmon"	255 160 122)
+    ("orange"		255 165 0)
+    ("darkorange"	255 140 0)
+    ("coral"		255 127 80)
+    ("lightcoral"	240 128 128)
+    ("tomato"		255 99 71)
+    ("orangered"	255 69 0)
+    ("red"		255 0 0)
+    ("hotpink"		255 105 180)
+    ("deeppink"		255 20 147)
+    ("pink"		255 192 203)
+    ("lightpink"	255 182 193)
+    ("palevioletred"	219 112 147)
+    ("maroon"		176 48 96)
+    ("mediumvioletred"	199 21 133)
+    ("violetred"	208 32 144)
+    ("magenta"		255 0 255)
+    ("violet"		238 130 238)
+    ("plum"		221 160 221)
+    ("orchid"		218 112 214)
+    ("mediumorchid"	186 85 211)
+    ("darkorchid"	153 50 204)
+    ("darkviolet"	148 0 211)
+    ("blueviolet"	138 43 226)
+    ("purple"		160 32 240)
+    ("mediumpurple"	147 112 219)
+    ("thistle"		216 191 216)
+    ("snow1"		255 250 250)
+    ("snow2"		238 233 233)
+    ("snow3"		205 201 201)
+    ("snow4"		139 137 137)
+    ("seashell1"	255 245 238)
+    ("seashell2"	238 229 222)
+    ("seashell3"	205 197 191)
+    ("seashell4"	139 134 130)
+    ("antiquewhite1"	255 239 219)
+    ("antiquewhite2"	238 223 204)
+    ("antiquewhite3"	205 192 176)
+    ("antiquewhite4"	139 131 120)
+    ("bisque1"		255 228 196)
+    ("bisque2"		238 213 183)
+    ("bisque3"		205 183 158)
+    ("bisque4"		139 125 107)
+    ("peachpuff1"	255 218 185)
+    ("peachpuff2"	238 203 173)
+    ("peachpuff3"	205 175 149)
+    ("peachpuff4"	139 119 101)
+    ("navajowhite1"	255 222 173)
+    ("navajowhite2"	238 207 161)
+    ("navajowhite3"	205 179 139)
+    ("navajowhite4"	139 121 94)
+    ("lemonchiffon1"	255 250 205)
+    ("lemonchiffon2"	238 233 191)
+    ("lemonchiffon3"	205 201 165)
+    ("lemonchiffon4"	139 137 112)
+    ("cornsilk1"	255 248 220)
+    ("cornsilk2"	238 232 205)
+    ("cornsilk3"	205 200 177)
+    ("cornsilk4"	139 136 120)
+    ("ivory1"		255 255 240)
+    ("ivory2"		238 238 224)
+    ("ivory3"		205 205 193)
+    ("ivory4"		139 139 131)
+    ("honeydew1"	240 255 240)
+    ("honeydew2"	224 238 224)
+    ("honeydew3"	193 205 193)
+    ("honeydew4"	131 139 131)
+    ("lavenderblush1"	255 240 245)
+    ("lavenderblush2"	238 224 229)
+    ("lavenderblush3"	205 193 197)
+    ("lavenderblush4"	139 131 134)
+    ("mistyrose1"	255 228 225)
+    ("mistyrose2"	238 213 210)
+    ("mistyrose3"	205 183 181)
+    ("mistyrose4"	139 125 123)
+    ("azure1"		240 255 255)
+    ("azure2"		224 238 238)
+    ("azure3"		193 205 205)
+    ("azure4"		131 139 139)
+    ("slateblue1"	131 111 255)
+    ("slateblue2"	122 103 238)
+    ("slateblue3"	105 89 205)
+    ("slateblue4"	71 60 139)
+    ("royalblue1"	72 118 255)
+    ("royalblue2"	67 110 238)
+    ("royalblue3"	58 95 205)
+    ("royalblue4"	39 64 139)
+    ("blue1"		0 0 255)
+    ("blue2"		0 0 238)
+    ("blue3"		0 0 205)
+    ("blue4"		0 0 139)
+    ("dodgerblue1"	30 144 255)
+    ("dodgerblue2"	28 134 238)
+    ("dodgerblue3"	24 116 205)
+    ("dodgerblue4"	16 78 139)
+    ("steelblue1"	99 184 255)
+    ("steelblue2"	92 172 238)
+    ("steelblue3"	79 148 205)
+    ("steelblue4"	54 100 139)
+    ("deepskyblue1"	0 191 255)
+    ("deepskyblue2"	0 178 238)
+    ("deepskyblue3"	0 154 205)
+    ("deepskyblue4"	0 104 139)
+    ("skyblue1"		135 206 255)
+    ("skyblue2"		126 192 238)
+    ("skyblue3"		108 166 205)
+    ("skyblue4"		74 112 139)
+    ("lightskyblue1"	176 226 255)
+    ("lightskyblue2"	164 211 238)
+    ("lightskyblue3"	141 182 205)
+    ("lightskyblue4"	96 123 139)
+    ("slategray1"	198 226 255)
+    ("slategray2"	185 211 238)
+    ("slategray3"	159 182 205)
+    ("slategray4"	108 123 139)
+    ("lightsteelblue1"	202 225 255)
+    ("lightsteelblue2"	188 210 238)
+    ("lightsteelblue3"	162 181 205)
+    ("lightsteelblue4"	110 123 139)
+    ("lightblue1"	191 239 255)
+    ("lightblue2"	178 223 238)
+    ("lightblue3"	154 192 205)
+    ("lightblue4"	104 131 139)
+    ("lightcyan1"	224 255 255)
+    ("lightcyan2"	209 238 238)
+    ("lightcyan3"	180 205 205)
+    ("lightcyan4"	122 139 139)
+    ("paleturquoise1"	187 255 255)
+    ("paleturquoise2"	174 238 238)
+    ("paleturquoise3"	150 205 205)
+    ("paleturquoise4"	102 139 139)
+    ("cadetblue1"	152 245 255)
+    ("cadetblue2"	142 229 238)
+    ("cadetblue3"	122 197 205)
+    ("cadetblue4"	83 134 139)
+    ("turquoise1"	0 245 255)
+    ("turquoise2"	0 229 238)
+    ("turquoise3"	0 197 205)
+    ("turquoise4"	0 134 139)
+    ("cyan1"		0 255 255)
+    ("cyan2"		0 238 238)
+    ("cyan3"		0 205 205)
+    ("cyan4"		0 139 139)
+    ("darkslategray1"	151 255 255)
+    ("darkslategray2"	141 238 238)
+    ("darkslategray3"	121 205 205)
+    ("darkslategray4"	82 139 139)
+    ("aquamarine1"	127 255 212)
+    ("aquamarine2"	118 238 198)
+    ("aquamarine3"	102 205 170)
+    ("aquamarine4"	69 139 116)
+    ("darkseagreen1"	193 255 193)
+    ("darkseagreen2"	180 238 180)
+    ("darkseagreen3"	155 205 155)
+    ("darkseagreen4"	105 139 105)
+    ("seagreen1"	84 255 159)
+    ("seagreen2"	78 238 148)
+    ("seagreen3"	67 205 128)
+    ("seagreen4"	46 139 87)
+    ("palegreen1"	154 255 154)
+    ("palegreen2"	144 238 144)
+    ("palegreen3"	124 205 124)
+    ("palegreen4"	84 139 84)
+    ("springgreen1"	0 255 127)
+    ("springgreen2"	0 238 118)
+    ("springgreen3"	0 205 102)
+    ("springgreen4"	0 139 69)
+    ("green1"		0 255 0)
+    ("green2"		0 238 0)
+    ("green3"		0 205 0)
+    ("green4"		0 139 0)
+    ("chartreuse1"	127 255 0)
+    ("chartreuse2"	118 238 0)
+    ("chartreuse3"	102 205 0)
+    ("chartreuse4"	69 139 0)
+    ("olivedrab1"	192 255 62)
+    ("olivedrab2"	179 238 58)
+    ("olivedrab3"	154 205 50)
+    ("olivedrab4"	105 139 34)
+    ("darkolivegreen1"	202 255 112)
+    ("darkolivegreen2"	188 238 104)
+    ("darkolivegreen3"	162 205 90)
+    ("darkolivegreen4"	110 139 61)
+    ("khaki1"		255 246 143)
+    ("khaki2"		238 230 133)
+    ("khaki3"		205 198 115)
+    ("khaki4"		139 134 78)
+    ("lightgoldenrod1"	255 236 139)
+    ("lightgoldenrod2"	238 220 130)
+    ("lightgoldenrod3"	205 190 112)
+    ("lightgoldenrod4"	139 129 76)
+    ("lightyellow1"	255 255 224)
+    ("lightyellow2"	238 238 209)
+    ("lightyellow3"	205 205 180)
+    ("lightyellow4"	139 139 122)
+    ("yellow1"		255 255 0)
+    ("yellow2"		238 238 0)
+    ("yellow3"		205 205 0)
+    ("yellow4"		139 139 0)
+    ("gold1"		255 215 0)
+    ("gold2"		238 201 0)
+    ("gold3"		205 173 0)
+    ("gold4"		139 117 0)
+    ("goldenrod1"	255 193 37)
+    ("goldenrod2"	238 180 34)
+    ("goldenrod3"	205 155 29)
+    ("goldenrod4"	139 105 20)
+    ("darkgoldenrod1"	255 185 15)
+    ("darkgoldenrod2"	238 173 14)
+    ("darkgoldenrod3"	205 149 12)
+    ("darkgoldenrod4"	139 101 8)
+    ("rosybrown1"	255 193 193)
+    ("rosybrown2"	238 180 180)
+    ("rosybrown3"	205 155 155)
+    ("rosybrown4"	139 105 105)
+    ("indianred1"	255 106 106)
+    ("indianred2"	238 99 99)
+    ("indianred3"	205 85 85)
+    ("indianred4"	139 58 58)
+    ("sienna1"		255 130 71)
+    ("sienna2"		238 121 66)
+    ("sienna3"		205 104 57)
+    ("sienna4"		139 71 38)
+    ("burlywood1"	255 211 155)
+    ("burlywood2"	238 197 145)
+    ("burlywood3"	205 170 125)
+    ("burlywood4"	139 115 85)
+    ("wheat1"		255 231 186)
+    ("wheat2"		238 216 174)
+    ("wheat3"		205 186 150)
+    ("wheat4"		139 126 102)
+    ("tan1"		255 165 79)
+    ("tan2"		238 154 73)
+    ("tan3"		205 133 63)
+    ("tan4"		139 90 43)
+    ("chocolate1"	255 127 36)
+    ("chocolate2"	238 118 33)
+    ("chocolate3"	205 102 29)
+    ("chocolate4"	139 69 19)
+    ("firebrick1"	255 48 48)
+    ("firebrick2"	238 44 44)
+    ("firebrick3"	205 38 38)
+    ("firebrick4"	139 26 26)
+    ("brown1"		255 64 64)
+    ("brown2"		238 59 59)
+    ("brown3"		205 51 51)
+    ("brown4"		139 35 35)
+    ("salmon1"		255 140 105)
+    ("salmon2"		238 130 98)
+    ("salmon3"		205 112 84)
+    ("salmon4"		139 76 57)
+    ("lightsalmon1"	255 160 122)
+    ("lightsalmon2"	238 149 114)
+    ("lightsalmon3"	205 129 98)
+    ("lightsalmon4"	139 87 66)
+    ("orange1"		255 165 0)
+    ("orange2"		238 154 0)
+    ("orange3"		205 133 0)
+    ("orange4"		139 90 0)
+    ("darkorange1"	255 127 0)
+    ("darkorange2"	238 118 0)
+    ("darkorange3"	205 102 0)
+    ("darkorange4"	139 69 0)
+    ("coral1"		255 114 86)
+    ("coral2"		238 106 80)
+    ("coral3"		205 91 69)
+    ("coral4"		139 62 47)
+    ("tomato1"		255 99 71)
+    ("tomato2"		238 92 66)
+    ("tomato3"		205 79 57)
+    ("tomato4"		139 54 38)
+    ("orangered1"	255 69 0)
+    ("orangered2"	238 64 0)
+    ("orangered3"	205 55 0)
+    ("orangered4"	139 37 0)
+    ("red1"		255 0 0)
+    ("red2"		238 0 0)
+    ("red3"		205 0 0)
+    ("red4"		139 0 0)
+    ("deeppink1"	255 20 147)
+    ("deeppink2"	238 18 137)
+    ("deeppink3"	205 16 118)
+    ("deeppink4"	139 10 80)
+    ("hotpink1"		255 110 180)
+    ("hotpink2"		238 106 167)
+    ("hotpink3"		205 96 144)
+    ("hotpink4"		139 58 98)
+    ("pink1"		255 181 197)
+    ("pink2"		238 169 184)
+    ("pink3"		205 145 158)
+    ("pink4"		139 99 108)
+    ("lightpink1"	255 174 185)
+    ("lightpink2"	238 162 173)
+    ("lightpink3"	205 140 149)
+    ("lightpink4"	139 95 101)
+    ("palevioletred1"	255 130 171)
+    ("palevioletred2"	238 121 159)
+    ("palevioletred3"	205 104 137)
+    ("palevioletred4"	139 71 93)
+    ("maroon1"		255 52 179)
+    ("maroon2"		238 48 167)
+    ("maroon3"		205 41 144)
+    ("maroon4"		139 28 98)
+    ("violetred1"	255 62 150)
+    ("violetred2"	238 58 140)
+    ("violetred3"	205 50 120)
+    ("violetred4"	139 34 82)
+    ("magenta1"		255 0 255)
+    ("magenta2"		238 0 238)
+    ("magenta3"		205 0 205)
+    ("magenta4"		139 0 139)
+    ("orchid1"		255 131 250)
+    ("orchid2"		238 122 233)
+    ("orchid3"		205 105 201)
+    ("orchid4"		139 71 137)
+    ("plum1"		255 187 255)
+    ("plum2"		238 174 238)
+    ("plum3"		205 150 205)
+    ("plum4"		139 102 139)
+    ("mediumorchid1"	224 102 255)
+    ("mediumorchid2"	209 95 238)
+    ("mediumorchid3"	180 82 205)
+    ("mediumorchid4"	122 55 139)
+    ("darkorchid1"	191 62 255)
+    ("darkorchid2"	178 58 238)
+    ("darkorchid3"	154 50 205)
+    ("darkorchid4"	104 34 139)
+    ("purple1"		155 48 255)
+    ("purple2"		145 44 238)
+    ("purple3"		125 38 205)
+    ("purple4"		85 26 139)
+    ("mediumpurple1"	171 130 255)
+    ("mediumpurple2"	159 121 238)
+    ("mediumpurple3"	137 104 205)
+    ("mediumpurple4"	93 71 139)
+    ("thistle1"		255 225 255)
+    ("thistle2"		238 210 238)
+    ("thistle3"		205 181 205)
+    ("thistle4"		139 123 139)
+    ("gray0"		0 0 0)
+    ("grey0"		0 0 0)
+    ("gray1"		3 3 3)
+    ("grey1"		3 3 3)
+    ("gray2"		5 5 5)
+    ("grey2"		5 5 5)
+    ("gray3"		8 8 8)
+    ("grey3"		8 8 8)
+    ("gray4"		10 10 10)
+    ("grey4"		10 10 10)
+    ("gray5"		13 13 13)
+    ("grey5"		13 13 13)
+    ("gray6"		15 15 15)
+    ("grey6"		15 15 15)
+    ("gray7"		18 18 18)
+    ("grey7"		18 18 18)
+    ("gray8"		20 20 20)
+    ("grey8"		20 20 20)
+    ("gray9"		23 23 23)
+    ("grey9"		23 23 23)
+    ("gray10"		26 26 26)
+    ("grey10"		26 26 26)
+    ("gray11"		28 28 28)
+    ("grey11"		28 28 28)
+    ("gray12"		31 31 31)
+    ("grey12"		31 31 31)
+    ("gray13"		33 33 33)
+    ("grey13"		33 33 33)
+    ("gray14"		36 36 36)
+    ("grey14"		36 36 36)
+    ("gray15"		38 38 38)
+    ("grey15"		38 38 38)
+    ("gray16"		41 41 41)
+    ("grey16"		41 41 41)
+    ("gray17"		43 43 43)
+    ("grey17"		43 43 43)
+    ("gray18"		46 46 46)
+    ("grey18"		46 46 46)
+    ("gray19"		48 48 48)
+    ("grey19"		48 48 48)
+    ("gray20"		51 51 51)
+    ("grey20"		51 51 51)
+    ("gray21"		54 54 54)
+    ("grey21"		54 54 54)
+    ("gray22"		56 56 56)
+    ("grey22"		56 56 56)
+    ("gray23"		59 59 59)
+    ("grey23"		59 59 59)
+    ("gray24"		61 61 61)
+    ("grey24"		61 61 61)
+    ("gray25"		64 64 64)
+    ("grey25"		64 64 64)
+    ("gray26"		66 66 66)
+    ("grey26"		66 66 66)
+    ("gray27"		69 69 69)
+    ("grey27"		69 69 69)
+    ("gray28"		71 71 71)
+    ("grey28"		71 71 71)
+    ("gray29"		74 74 74)
+    ("grey29"		74 74 74)
+    ("gray30"		77 77 77)
+    ("grey30"		77 77 77)
+    ("gray31"		79 79 79)
+    ("grey31"		79 79 79)
+    ("gray32"		82 82 82)
+    ("grey32"		82 82 82)
+    ("gray33"		84 84 84)
+    ("grey33"		84 84 84)
+    ("gray34"		87 87 87)
+    ("grey34"		87 87 87)
+    ("gray35"		89 89 89)
+    ("grey35"		89 89 89)
+    ("gray36"		92 92 92)
+    ("grey36"		92 92 92)
+    ("gray37"		94 94 94)
+    ("grey37"		94 94 94)
+    ("gray38"		97 97 97)
+    ("grey38"		97 97 97)
+    ("gray39"		99 99 99)
+    ("grey39"		99 99 99)
+    ("gray40"		102 102 102)
+    ("grey40"		102 102 102)
+    ("gray41"		105 105 105)
+    ("grey41"		105 105 105)
+    ("gray42"		107 107 107)
+    ("grey42"		107 107 107)
+    ("gray43"		110 110 110)
+    ("grey43"		110 110 110)
+    ("gray44"		112 112 112)
+    ("grey44"		112 112 112)
+    ("gray45"		115 115 115)
+    ("grey45"		115 115 115)
+    ("gray46"		117 117 117)
+    ("grey46"		117 117 117)
+    ("gray47"		120 120 120)
+    ("grey47"		120 120 120)
+    ("gray48"		122 122 122)
+    ("grey48"		122 122 122)
+    ("gray49"		125 125 125)
+    ("grey49"		125 125 125)
+    ("gray50"		127 127 127)
+    ("grey50"		127 127 127)
+    ("gray51"		130 130 130)
+    ("grey51"		130 130 130)
+    ("gray52"		133 133 133)
+    ("grey52"		133 133 133)
+    ("gray53"		135 135 135)
+    ("grey53"		135 135 135)
+    ("gray54"		138 138 138)
+    ("grey54"		138 138 138)
+    ("gray55"		140 140 140)
+    ("grey55"		140 140 140)
+    ("gray56"		143 143 143)
+    ("grey56"		143 143 143)
+    ("gray57"		145 145 145)
+    ("grey57"		145 145 145)
+    ("gray58"		148 148 148)
+    ("grey58"		148 148 148)
+    ("gray59"		150 150 150)
+    ("grey59"		150 150 150)
+    ("gray60"		153 153 153)
+    ("grey60"		153 153 153)
+    ("gray61"		156 156 156)
+    ("grey61"		156 156 156)
+    ("gray62"		158 158 158)
+    ("grey62"		158 158 158)
+    ("gray63"		161 161 161)
+    ("grey63"		161 161 161)
+    ("gray64"		163 163 163)
+    ("grey64"		163 163 163)
+    ("gray65"		166 166 166)
+    ("grey65"		166 166 166)
+    ("gray66"		168 168 168)
+    ("grey66"		168 168 168)
+    ("gray67"		171 171 171)
+    ("grey67"		171 171 171)
+    ("gray68"		173 173 173)
+    ("grey68"		173 173 173)
+    ("gray69"		176 176 176)
+    ("grey69"		176 176 176)
+    ("gray70"		179 179 179)
+    ("grey70"		179 179 179)
+    ("gray71"		181 181 181)
+    ("grey71"		181 181 181)
+    ("gray72"		184 184 184)
+    ("grey72"		184 184 184)
+    ("gray73"		186 186 186)
+    ("grey73"		186 186 186)
+    ("gray74"		189 189 189)
+    ("grey74"		189 189 189)
+    ("gray75"		191 191 191)
+    ("grey75"		191 191 191)
+    ("gray76"		194 194 194)
+    ("grey76"		194 194 194)
+    ("gray77"		196 196 196)
+    ("grey77"		196 196 196)
+    ("gray78"		199 199 199)
+    ("grey78"		199 199 199)
+    ("gray79"		201 201 201)
+    ("grey79"		201 201 201)
+    ("gray80"		204 204 204)
+    ("grey80"		204 204 204)
+    ("gray81"		207 207 207)
+    ("grey81"		207 207 207)
+    ("gray82"		209 209 209)
+    ("grey82"		209 209 209)
+    ("gray83"		212 212 212)
+    ("grey83"		212 212 212)
+    ("gray84"		214 214 214)
+    ("grey84"		214 214 214)
+    ("gray85"		217 217 217)
+    ("grey85"		217 217 217)
+    ("gray86"		219 219 219)
+    ("grey86"		219 219 219)
+    ("gray87"		222 222 222)
+    ("grey87"		222 222 222)
+    ("gray88"		224 224 224)
+    ("grey88"		224 224 224)
+    ("gray89"		227 227 227)
+    ("grey89"		227 227 227)
+    ("gray90"		229 229 229)
+    ("grey90"		229 229 229)
+    ("gray91"		232 232 232)
+    ("grey91"		232 232 232)
+    ("gray92"		235 235 235)
+    ("grey92"		235 235 235)
+    ("gray93"		237 237 237)
+    ("grey93"		237 237 237)
+    ("gray94"		240 240 240)
+    ("grey94"		240 240 240)
+    ("gray95"		242 242 242)
+    ("grey95"		242 242 242)
+    ("gray96"		245 245 245)
+    ("grey96"		245 245 245)
+    ("gray97"		247 247 247)
+    ("grey97"		247 247 247)
+    ("gray98"		250 250 250)
+    ("grey98"		250 250 250)
+    ("gray99"		252 252 252)
+    ("grey99"		252 252 252)
+    ("gray100"		255 255 255)
+    ("grey100"		255 255 255)
+    ("darkgrey"		169 169 169)
+    ("darkgray"		169 169 169)
+    ("darkblue"		0 0 139)
+    ("darkcyan"		0 139 139)
+    ("darkmagenta"	139 0 139)
+    ("darkred"		139 0 0)
+    ("lightgreen"	144 238 144))
+  "An alist of X color names and associated 8-bit RGB values.")
+
+(defvar tty-standard-colors
+  '(("white"	7 65535 65535 65535)
+    ("cyan"	6     0 65535 65535)
+    ("magenta"	5 65535     0 65535)
+    ("blue"	4     0     0 65535)
+    ("yellow"	3 65535 65535     0)
+    ("green"	2     0 65535     0)
+    ("red"	1 65535     0     0)
+    ("black"	0     0     0     0))
+  "An alist of 8 standard tty colors, their indices and RGB values.")
+
+(defvar tty-color-alist nil
+  "An alist of colors supported by the terminal.
+Each element is of the form:
+ \(NAME INDEX R G B\)
+where NAME is the name of the color, a string;
+INDEX is the index of this color to be sent to the terminal driver
+when the color should be displayed; it is typically a small integer;
+R, G, and B are the intensities of, accordingly, red, green, and blue
+components of the color, represented as numbers between 0 and 65535.
+The file `etc/rgb.txt' in the Emacs distribution lists the standard
+RGB values of the X colors.  If RGB is nil, this color will not be
+considered by `tty-color-translate' as an approximation to another
+color.")
+
+(defun tty-color-canonicalize (color)
+  "Return COLOR in canonical form.
+A canonicalized color name is all-lower case, with any blanks removed."
+  (let ((color (downcase color)))
+    (while (string-match " +" color)
+      (setq color (replace-match "" nil nil color)))
+    color))
+
+(defun tty-color-define (name index &optional rgb)
+  "Specify a tty color by its NAME, terminal INDEX and RGB values.
+NAME is a string, INDEX is typically a small integer used to send to
+the terminal driver to switch on this color, and RGB is a list of 3
+numbers that specify the intensity of red, green, and blue components
+of the color.
+If specified, each one of the RGB components must be a number between
+0 and 65535.  If RGB is omitted, the specified color will never be used
+by `tty-color-translate' as an approximation to another color."
+  (if (or (not (stringp name))
+	  (not (integerp index))
+	  (and rgb (or (not (listp rgb)) (/= (length rgb) 3))))
+      (error "Invalid specification for tty color \"%s\"" name))
+  (let* ((name (tty-color-canonicalize name))
+	 (entry (assoc name tty-color-alist)))
+    (if entry
+	(setcdr entry (cons index rgb))
+      (setq tty-color-alist
+	    (cons (append (list name index) rgb) tty-color-alist)))
+    tty-color-alist))
+
+(defun tty-color-clear ()
+  "Clear the list of supported tty colors."
+  (setq tty-color-alist nil))
+
+(defun tty-color-off-gray-diag (r g b)
+  "Compute the angle between the color given by R,G,B and the gray diagonal."
+  (let ((mag (sqrt (* 3 (+ (* r r) (* g g) (* b b))))))
+    (if (< mag 1) 0 (acos (/ (+ r g b) mag)))))
+
+(defun tty-color-approximate (rgb)
+  "Given a list of 3 rgb values in RGB, find the color in `tty-color-alist'
+which is the best approximation in the 3-dimensional RGB space,
+and return the index associated with the approximating color.
+Each value of the RGB triplet has to be scaled to the 0..255 range."
+  (let* ((color-list tty-color-alist)
+	 (candidate (car color-list))
+	 (best-distance 195076)	;; 3 * 255^2 + 15
+	 best-color)
+    (while candidate
+      (let* ((try-rgb (cddr candidate))
+	     (r (car rgb))
+	     (g (cadr rgb))
+	     (b (nth 2 rgb))
+	     ;; If the approximated color is not close enough to the
+	     ;; gray diagonal of the RGB cube, favor non-gray colors.
+	     ;; (The number 0.065 is an empirical ad-hoc'ery.)
+	     (favor-non-gray (>= (tty-color-off-gray-diag r g b) 0.065))
+	     try-r try-g try-b
+	     dif-r dif-g dif-b dist)
+	;; If the RGB values of the candidate color are unknown, we
+	;; never consider it for approximating another color.
+	(if try-rgb
+	    (progn
+	      (setq try-r (lsh (car try-rgb) -8)
+		    try-g (lsh (cadr try-rgb) -8)
+		    try-b (lsh (nth 2 try-rgb) -8))
+	      (setq dif-r (- (car rgb) try-r)
+		    dif-g (- (cadr rgb) try-g)
+		    dif-b (- (nth 2 rgb) try-b))
+	      (setq dist (+ (* dif-r dif-r) (* dif-g dif-g) (* dif-b dif-b)))
+	      (if (and (< dist best-distance)
+		       ;; The candidate color is on the gray diagonal
+		       ;; if its RGB components are all equal.
+		       (or (/= try-r try-g) (/= try-g try-b)
+			   (not favor-non-gray)))
+		  (setq best-distance dist
+			best-color candidate)))))
+      (setq color-list (cdr color-list))
+      (setq candidate (car color-list)))
+    (cadr best-color)))
+
+(defun tty-color-translate (color)
+  "Given a color COLOR, return the index of the corresponding TTY color.
+COLOR must be a string that is either the color's name, or its X-style
+specification like \"#RRGGBB\" or \"RGB:rr/gg/bb\", where each primary.
+color can be given with 1 to 4 hex digits.
+If COLOR is a color name that is found among supported colors in
+`tty-color-alist', the associated index is returned.  Otherwise, the
+RGB values of the color, either as given by the argument or from
+looking up the name in `color-name-rgb-alist', are used to find the
+supported color that is the best approximation for COLOR in the RGB
+space.
+If COLOR is neither a valid X RGB specification of the color, nor a
+name of a color in `color-name-rgb-alist', the returned value is nil."
+  (and (stringp color)
+       (let* ((color (tty-color-canonicalize color))
+	      (idx (cadr (assoc color tty-color-alist))))
+	 (or idx
+	     (let* ((len (length color))
+		    (maxval 256)
+		    (rgb
+		     (cond
+		      ((and (>= len 4)  ;; X-style "#XXYYZZ" color spec
+			    (eq (aref color 0) ?#)
+			    (member (aref color 1)
+				    '(?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9
+					 ?a ?b ?c ?d ?e ?f)))
+		       ;; Translate the string "#XXYYZZ" into a list
+		       ;; of numbers (XX YY ZZ).  If the primary colors
+		       ;; are specified with less than 4 hex digits,
+		       ;; the used digits represent the most significant
+		       ;; bits of the value (e.g. #XYZ = #X000Y000Z000).
+		       (let* ((ndig (/ (- len 1) 3))
+			      (i1 1)
+			      (i2 (+ i1 ndig))
+			      (i3 (+ i2 ndig)))
+			 (list
+			  (lsh
+			   (string-to-number (substring color i1 i2) 16)
+			   (* 4 (- 2 ndig)))
+			  (lsh
+			   (string-to-number (substring color i2 i3) 16)
+			   (* 4 (- 2 ndig)))
+			  (lsh
+			   (string-to-number (substring color i3) 16)
+			   (* 4 (- 2 ndig))))))
+		      ((and (>= len 9)  ;; X-style RGB:xx/yy/zz color spec
+			    (string= (substring color 0 4) "rgb:"))
+		       ;; Translate the string "RGB:XX/YY/ZZ" into a list
+		       ;; of numbers (XX YY ZZ).  If fewer than 4 hex
+		       ;; digits are used, they represent the fraction
+		       ;; of the maximum value (RGB:X/Y/Z = #XXXXYYYYZZZZ).
+		       (let* ((ndig (/ (- len 3) 3))
+			      (maxval (1- (expt 16 (- ndig 1))))
+			      (i1 4)
+			      (i2 (+ i1 ndig))
+			      (i3 (+ i2 ndig)))
+			 (list
+			  (/ (* (string-to-number
+				 (substring color i1 (- i2 1)) 16)
+				255)
+			     maxval)
+			  (/ (* (string-to-number
+				 (substring color i2 (- i3 1)) 16)
+				255)
+			     maxval)
+			  (/ (* (string-to-number
+				 (substring color i3) 16)
+				255)
+			     maxval))))
+		      (t
+		       (cdr (assoc color color-name-rgb-alist))))))
+	       (and rgb (tty-color-approximate rgb)))))))
+
+(defun tty-color-by-index (idx)
+  "Given a numeric index of a tty color, return its description.
+Value is a list of the form \(NAME INDEX R G B\)."
+  (and idx
+       (let ((colors tty-color-alist)
+	     desc found)
+	 (while colors
+	   (setq desc (car colors))
+	   (if (eq idx (car (cdr desc)))
+	       (setq found desc))
+	   (setq colors (cdr colors)))
+	 found)))
+
+(defun tty-color-values (color &optional frame)
+  "Return RGB values of the color COLOR on a termcap frame FRAME.
+If COLOR is not directly supported by the display, return the RGB
+values for a supported color that is its best approximation.
+The value is a list of integer RGB values--\(RED GREEN BLUE\).
+These values range from 0 to 65535; white is (65535 65535 65535).
+If FRAME is omitted or nil, use the selected frame."
+  (let* ((frame (or frame (selected-frame)))
+	 (color (tty-color-canonicalize color))
+	 (supported (assoc color tty-color-alist)))
+    (or (and supported (cddr supported)) ; full spec in tty-color-alist
+	(and supported	; no RGB values in tty-color-alist: use X RGB values
+	     (assoc color color-name-rgb-alist)
+	     (cddr
+	      (tty-color-by-index
+	       (tty-color-approximate
+		(cdr (assoc color color-name-rgb-alist))))))
+	(cddr (tty-color-by-index (tty-color-translate color))))))
+
+(defun tty-color-desc (color)
+  "Return the description of the color COLOR for a character terminal.
+Value is a list of the form \(NAME INDEX R G B\).  Note that the returned
+NAME is not necessarily the same string as the argument COLOR, because
+the latter might need to be approximated if it is not supported directly."
+  (let ((idx (tty-color-translate color)))
+    (tty-color-by-index idx)))