Mercurial > emacs
changeset 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 | c13ab7bc6fdc |
children | 0aad3e0b47d2 |
files | lisp/ChangeLog lisp/facemenu.el lisp/faces.el lisp/loadup.el lisp/startup.el lisp/term/pc-win.el lisp/term/tty-colors.el lisp/term/w32-win.el lisp/term/x-win.el |
diffstat | 9 files changed, 1131 insertions(+), 328 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Mon Dec 06 17:52:27 1999 +0000 +++ b/lisp/ChangeLog Mon Dec 06 17:55:00 1999 +0000 @@ -1,3 +1,52 @@ +1999-12-06 Eli Zaretskii <eliz@is.elta.co.il> + + 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. + 1999-12-06 Dave Love <fx@gnu.org> * ffap.el: Autoload the ffap alias directly.
--- a/lisp/facemenu.el Mon Dec 06 17:52:27 1999 +0000 +++ b/lisp/facemenu.el Mon Dec 06 17:55:00 1999 +0000 @@ -467,9 +467,7 @@ "Read a color using the minibuffer." (let ((col (completing-read (or prompt "Color: ") (or facemenu-color-alist - (if window-system - (mapcar 'list (x-defined-colors)) - (mapcar 'list (tty-defined-colors)))) + (mapcar 'list (defined-colors))) nil t))) (if (equal "" col) nil @@ -483,9 +481,7 @@ of colors that the current display can handle." (interactive) (when (null list) - (setq list (if window-system - (x-defined-colors) - (tty-defined-colors))) + (setq list (defined-colors)) ;; Delete duplicate colors. (let ((l list)) (while (cdr l) @@ -511,15 +507,11 @@ (defun facemenu-color-equal (a b) "Return t if colors A and B are the same color. A and B should be strings naming colors. -This function queries the window-system server to find out what the -color names mean. It returns nil if the colors differ or if it can't +This function queries the display system to find out what the color +names mean. It returns nil if the colors differ or if it can't determine the correct answer." (cond ((equal a b) t) - ((and (memq window-system '(x w32)) - (equal (x-color-values a) (x-color-values b)))) - ((eq window-system 'pc) - (and (x-color-defined-p a) (x-color-defined-p b) - (eq (msdos-color-translate a) (msdos-color-translate b)))))) + ((equal (color-values a) (color-values b))))) (defun facemenu-add-face (face &optional start end) "Add FACE to text between START and END.
--- a/lisp/faces.el Mon Dec 06 17:52:27 1999 +0000 +++ b/lisp/faces.el Mon Dec 06 17:55:00 1999 +0000 @@ -758,8 +758,7 @@ (internal-lisp-face-attribute-values attribute)))) ((:foreground :background) (mapcar #'(lambda (c) (cons c c)) - (or (and window-system (x-defined-colors frame)) - (tty-defined-colors)))) + (defined-colors frame))) ((:height) 'integerp) (:stipple @@ -858,6 +857,13 @@ (cond ((listp valid) (setq new-value (face-read-string face old-value attribute-name valid)) + ;; Terminal frames can support colors that don't appear + ;; explicitly in VALID, using color approximation code + ;; in tty-colors.el. + (if (and (memq attribute '(:foreground :background)) + (not (memq window-system '(x w32 mac))) + (not (eq new-value 'unspecified))) + (setq new-value (car (tty-color-desc new-value)))) (unless (eq new-value 'unspecified) (setq new-value (cdr (assoc new-value valid))))) ((eq valid 'integerp) @@ -1141,6 +1147,60 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Frame-type independent color support. +;;; We keep the old x-* names as aliases for back-compatibility. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun defined-colors (&optional frame) + "Return a list of colors supported for a particular frame. +The argument FRAME specifies which frame to try. +The value may be different for frames on different display types. +If FRAME doesn't support colors, the value is nil." + (if (memq (framep (or frame (selected-frame))) '(x w32)) + (xw-defined-colors frame) + (mapcar 'car tty-color-alist))) +(defalias 'x-defined-colors 'defined-colors) + +(defun color-defined-p (color &optional frame) + "Return non-nil if color COLOR is supported on frame FRAME. +If FRAME is omitted or nil, use the selected frame. +If COLOR is the symbol `unspecified', the value is nil." + (if (eq color 'unspecified) + nil + (if (memq (framep (or frame (selected-frame))) '(x w32)) + (xw-color-defined-p color frame) + (numberp (tty-color-translate color))))) +(defalias 'x-color-defined-p 'color-defined-p) + +(defun color-values (color &optional frame) + "Return a description of the color named COLOR on frame FRAME. +The value is a list of integer RGB values--\(RED GREEN BLUE\). +These values appear to range from 0 to 65280 or 65535, depending +on the system; white is \(65280 65280 65280\) or \(65535 65535 65535\). +If FRAME is omitted or nil, use the selected frame. +If FRAME cannot display COLOR, the value is nil. +If COLOR is the symbol `unspecified', the value is nil." + (if (eq color 'unspecified) + nil + (if (memq (framep (or frame (selected-frame))) '(x w32)) + (xw-color-values color frame) + (tty-color-values color frame)))) +(defalias 'x-color-values 'color-values) + +(defun display-color-p (&optional display) + "Return t if DISPLAY supports color. +The optional argument DISPLAY specifies which display to ask about. +DISPLAY should be either a frame or a display name (a string). +If omitted or nil, that stands for the selected frame's display." + (if (and (stringp display) (not (fboundp 'x-display-list))) + nil + (if (memq (framep (or display (selected-frame))) '(x w32)) + (xw-display-color-p display) + (tty-display-color-p)))) +(defalias 'x-display-color-p 'display-color-p) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Background mode. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
--- a/lisp/loadup.el Mon Dec 06 17:52:27 1999 +0000 +++ b/lisp/loadup.el Mon Dec 06 17:55:00 1999 +0000 @@ -107,6 +107,7 @@ (load "isearch") (load "window") (load "frame") +(load "term/tty-colors") (load "faces") (if (fboundp 'frame-face-alist) (progn
--- a/lisp/startup.el Mon Dec 06 17:52:27 1999 +0000 +++ b/lisp/startup.el Mon Dec 06 17:55:00 1999 +0000 @@ -735,16 +735,16 @@ (funcall initial-major-mode)))) ;; Register default TTY colors for the case the terminal hasn't a - ;; terminal init file. The colors are good for xterm-color and the - ;; FreeBSD console (cons.*). They should be sufficient for Linux - ;; too, I guess. - (or (eq window-system 'pc) ; pc-win.el did this already - (let ((colors '("black" "red" "green" "yellow" "blue" "magenta" - "cyan" "white")) - (i 0)) + ;; terminal init file. + (or (memq window-system '(x w32)) + (not (tty-display-color-p)) + (let* ((colors (if (eq window-system 'pc) + msdos-color-values + tty-standard-colors)) + (color (car colors))) (while colors - (face-register-tty-color (car colors) i) - (setq colors (cdr colors) i (1+ i))))) + (tty-color-define (car color) (cadr color) (cddr color)) + (setq colors (cdr colors) color (car colors))))) ;; Load library for our terminal type. ;; User init file can set term-file-prefix to nil to prevent this.
--- a/lisp/term/pc-win.el Mon Dec 06 17:52:27 1999 +0000 +++ b/lisp/term/pc-win.el Mon Dec 06 17:55:00 1999 +0000 @@ -26,285 +26,46 @@ (load "term/internal" nil t) -;; Color translation -- doesn't really need to be fast. -;; Colors listed here do not include the "light-", -;; "medium-" and "dark-" prefixes that are accounted for -;; by `msdos-color-translate', which see below). - -(defvar msdos-color-aliases - '(("snow" . "white") - ("ghost white" . "white") - ("ghostwhite" . "white") - ("white smoke" . "white") - ("whitesmoke" . "white") - ("gainsboro" . "white") - ("floral white" . "white") - ("floralwhite" . "white") - ("old lace" . "white") - ("oldlace" . "white") - ("linen" . "white") - ("antique white" . "white") - ("antiquewhite" . "white") - ("papaya whip" . "white") - ("papayawhip" . "white") - ("blanched almond" . "white") - ("blanchedalmond" . "white") - ("bisque" . "white") - ("peach puff" . "lightred") - ("peachpuff" . "lightred") - ("navajo white" . "lightred") - ("navajowhite" . "lightred") - ("moccasin" . "lightred") - ("cornsilk" . "white") - ("ivory" . "white") - ("lemon chiffon" . "yellow") - ("lemonchiffon" . "yellow") - ("seashell" . "white") - ("honeydew" . "white") - ("mint cream" . "white") - ("mintcream" . "white") - ("azure" . "lightcyan") - ("alice blue" . "lightcyan") - ("aliceblue" . "lightcyan") - ("lavender" . "lightcyan") - ("lavender blush" . "lightcyan") - ("lavenderblush" . "lightcyan") - ("misty rose" . "lightred") - ("mistyrose" . "lightred") - ("aquamarine" . "blue") - ("cadet blue" . "blue") - ("cadetblue" . "blue") - ("cornflower blue" . "lightblue") - ("cornflowerblue" . "lightblue") - ("midnight blue" . "blue") - ("midnightblue" . "blue") - ("navy blue" . "cyan") - ("navyblue" . "cyan") - ("navy" . "cyan") - ("royalblue" . "blue") - ("royal blue" . "blue") - ("sky blue" . "lightblue") - ("skyblue" . "lightblue") - ("dodger blue" . "blue") - ("dodgerblue" . "blue") - ("powder blue" . "lightblue") - ("powderblue" . "lightblue") - ("slate blue" . "cyan") - ("slateblue" . "cyan") - ("steel blue" . "blue") - ("steelblue" . "blue") - ("coral" . "lightred") - ("tomato" . "lightred") - ("firebrick" . "red") - ("gold" . "yellow") - ("goldenrod" . "yellow") - ("goldenrod yellow" . "yellow") - ("goldenrodyellow" . "yellow") - ("pale goldenrod" . "yellow") - ("palegoldenrod" . "yellow") - ("olive green" . "lightgreen") - ("olivegreen" . "lightgreen") - ("olive drab" . "green") - ("olivedrab" . "green") - ("forest green" . "green") - ("forestgreen" . "green") - ("lime green" . "lightgreen") - ("limegreen" . "lightgreen") - ("sea green" . "lightcyan") - ("seagreen" . "lightcyan") - ("spring green" . "green") - ("springgreen" . "green") - ("lawn green" . "lightgreen") - ("lawngreen" . "lightgreen") - ("chartreuse" . "yellow") - ("yellow green" . "lightgreen") - ("yellowgreen" . "lightgreen") - ("green yellow" . "lightgreen") - ("greenyellow" . "lightgreen") - ("slate grey" . "lightgray") - ("slategrey" . "lightgray") - ("slate gray" . "lightgray") - ("slategray" . "lightgray") - ("dim grey" . "darkgray") - ("dimgrey" . "darkgray") - ("dim gray" . "darkgray") - ("dimgray" . "darkgray") - ("light grey" . "lightgray") - ("lightgrey" . "lightgray") - ("light gray" . "lightgray") - ("gray" . "darkgray") - ("grey" . "darkgray") - ("khaki" . "green") - ("maroon" . "red") - ("orange" . "brown") - ("orchid" . "brown") - ("saddle brown" . "red") - ("saddlebrown" . "red") - ("peru" . "red") - ("burlywood" . "brown") - ("sandy brown" . "brown") - ("sandybrown" . "brown") - ("pink" . "lightred") - ("hotpink" . "lightred") - ("hot pink" ."lightred") - ("plum" . "magenta") - ("indian red" . "red") - ("indianred" . "red") - ("violet red" . "magenta") - ("violetred" . "magenta") - ("orange red" . "red") - ("orangered" . "red") - ("salmon" . "lightred") - ("sienna" . "lightred") - ("tan" . "lightred") - ("chocolate" . "brown") - ("thistle" . "magenta") - ("turquoise" . "lightgreen") - ("pale turquoise" . "cyan") - ("paleturquoise" . "cyan") - ("violet" . "magenta") - ("blue violet" . "lightmagenta") - ("blueviolet" . "lightmagenta") - ("wheat" . "white") - ("green yellow" . "yellow") - ("greenyellow" . "yellow") - ("purple" . "magenta") - ("rosybrown" . "brown") - ("rosy brown" . "brown") - ("beige" . "brown")) - "List of alternate names for colors.") - -(defun msdos-color-translate (name) - "Translate color specification in NAME into something DOS terminal groks." - (setq name (downcase name)) - (let* ((len (length name)) - (val (- (length x-colors) - (length (member name x-colors)))) - (try)) - (if (or (< val 0) (>= val (length x-colors))) (setq val nil)) - (or val - (and (setq try (cdr (assoc name msdos-color-aliases))) - (msdos-color-translate try)) - (and (> len 5) - (string= "light" (substring name 0 5)) - (setq try (msdos-color-translate (substring name 5))) - (logior try 8)) - (and (> len 6) - (string= "light " (substring name 0 6)) - (setq try (msdos-color-translate (substring name 6))) - (logior try 8)) - (and (> len 4) - (string= "pale" (substring name 0 4)) - (setq try (msdos-color-translate (substring name 4))) - (logior try 8)) - (and (> len 5) - (string= "pale " (substring name 0 5)) - (setq try (msdos-color-translate (substring name 5))) - (logior try 8)) - (and (> len 6) - (string= "medium" (substring name 0 6)) - (msdos-color-translate (substring name 6))) - (and (> len 7) - (string= "medium " (substring name 0 7)) - (msdos-color-translate (substring name 7))) - (and (> len 4) - (or (string= "dark" (substring name 0 4)) - (string= "deep" (substring name 0 4))) - (msdos-color-translate (substring name 4))) - (and (> len 5) - (or (string= "dark " (substring name 0 5)) - (string= "deep " (substring name 0 5))) - (msdos-color-translate (substring name 5))) - (and (> len 4) ;; gray shades: gray0 to gray100 - (save-match-data - (and - (string-match "gr[ae]y[0-9]" name) - (string-match "[0-9]+\\'" name) - (let ((num (string-to-int - (substring name (match-beginning 0))))) - (msdos-color-translate - (cond - ((> num 90) "white") - ((> num 50) "lightgray") - ((> num 10) "darkgray") - (t "black"))))))) - (and (> len 1) ;; purple1 to purple4 and the like - (save-match-data - (and - (string-match "[1-4]\\'" name) - (msdos-color-translate - (substring name 0 (match-beginning 0)))))) - (and (= len 7) ;; X-style "#XXYYZZ" color spec - (eq (aref name 0) ?#) - (member (aref name 1) - '(?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9 - ?A ?B ?C ?D ?E ?F ?a ?b ?c ?d ?e ?f)) - (msdos-color-translate - (msdos-approximate-color (string-to-number - (substring name 1) 16))))))) +;;; This is copied from etc/rgb.txt, except that some values were changed +;;; a bit to make them consistent with DOS console colors, and the RGB +;;; values were scaled up to 16 bits, as `tty-define-color' requires. ;;; -;;; This is copied from etc/rgb.txt, except that some values were changed -;;; a bit to make them consistent with DOS console colors. The order of -;;; the colors is according to the PC text mode color codes. +;;; The mapping between the 16 standard EGA/VGA colors and X color names +;;; was done by running a Unix version of Emacs inside an X client and a +;;; DJGPP-compiled Emacs on the same PC. The names of X colors used to +;;; define the pixel values are shown as comments to each color below. ;;; ;;; If you want to change the RGB values, keep in mind that various pieces ;;; of Emacs think that a color whose RGB values add up to less than 0.6 of -;;; the values for WHITE (i.e. less than 459) are ``dark'', otherwise the +;;; the values for WHITE (i.e. less than 117963) are ``dark'', otherwise the ;;; color is ``light''; see `frame-set-background-mode' in lisp/faces.el for ;;; an example. (defvar msdos-color-values - '(("black" 0 0 0) - ("blue" 0 0 255) - ("green" 0 255 0) - ("cyan" 0 255 255) - ("red" 255 0 0) - ("magenta" 139 0 139) ; dark magenta - ("brown" 165 42 42) - ("lightgray" 211 211 211) - ("darkgray" 102 102 102) ; gray40 - ("lightblue" 173 216 230) - ("lightgreen" 144 238 144) - ("lightcyan" 224 255 255) - ("lightred" 255 52 179) ; maroon1 - ("lightmagenta" 238 0 238) ; magenta2 - ("yellow" 255 255 0) - ("white" 255 255 255)) - "A list of MS-DOS console colors and their RGB values.") + '(("white" 15 65535 65535 65535) + ("yellow" 14 65535 65535 0) ; Yellow + ("lightmagenta" 13 65535 0 65535) ; Magenta + ("lightred" 12 65535 0 0) ; Red + ("lightcyan" 11 0 65535 65535) ; Cyan + ("lightgreen" 10 0 65535 0) ; Green + ("lightblue" 9 0 0 65535) ; Blue + ("darkgray" 8 26112 26112 26112) ; Gray40 + ("lightgray" 7 48640 48640 48640) ; Gray + ("brown" 6 40960 20992 11520) ; Sienna + ("magenta" 5 35584 0 35584) ; DarkMagenta + ("red" 4 45568 8704 8704) ; FireBrick + ("cyan" 3 0 52736 53504) ; DarkTurquoise + ("green" 2 8704 35584 8704) ; ForestGreen + ("blue" 1 0 0 52480) ; MediumBlue + ("black" 0 0 0 0)) + "A list of MS-DOS console colors, their indices and 16-bit RGB values.") -(defun msdos-approximate-color (num) - "Return a DOS color name which is the best approximation for the number NUM." - (let ((color-values msdos-color-values) - (candidate (car msdos-color-values)) - (best-distance 16777216) ;; 0xFFFFFF + 1 - best-color) - (while candidate - (let* ((values (cdr candidate)) - (value (+ (lsh (car values) 16) - (lsh (car (cdr values)) 8) - (nth 2 values)))) - (if (< (abs (- value num)) best-distance) - (setq best-distance (abs (- value num)) - best-color (car candidate)))) - (setq color-values (cdr color-values)) - (setq candidate (car color-values))) - best-color)) ;; --------------------------------------------------------------------------- ;; We want to delay setting frame parameters until the faces are setup (defvar default-frame-alist nil) (modify-frame-parameters terminal-frame default-frame-alist) +(tty-color-clear) (defun msdos-face-setup () - (modify-frame-parameters terminal-frame default-frame-alist) - (face-clear-tty-colors) - (let ((colors msdos-color-values) - (i 0)) - (while colors - (face-register-tty-color (car (car colors)) i) - (setq colors (cdr colors) i (1+ i)))) - - (frame-set-background-mode terminal-frame) - (face-set-after-frame-default terminal-frame) - (set-face-foreground 'bold "yellow" terminal-frame) (set-face-foreground 'italic "red" terminal-frame) (set-face-foreground 'bold-italic "lightred" terminal-frame) @@ -319,18 +80,47 @@ (set-face-background 'msdos-menu-passive-face "blue" terminal-frame) (set-face-background 'msdos-menu-select-face "red" terminal-frame)) -;; We have only one font, so... (add-hook 'before-init-hook 'msdos-face-setup) +(defun msdos-handle-reverse-video (frame parameters) + "Handle the reverse-video frame parameter on MS-DOS frames." + (when (cdr (assq 'reverse parameters)) + (let* ((params (frame-parameters frame)) + (bg (cdr (assq 'foreground-color params))) + (fg (cdr (assq 'background-color params)))) + (modify-frame-parameters frame '((reverse . nil))) + (if (equal bg (cdr (assq 'mouse-color params))) + (modify-frame-parameters frame + (list (cons 'mouse-color fg)))) + (if (equal bg (cdr (assq 'cursor-color params))) + (modify-frame-parameters frame + (list (cons 'cursor-color fg))))))) + +;; This must run after all the default colors are inserted into +;; tty-color-alist, since msdos-handle-reverse-video needs to know the +;; actual frame colors. tty-color-alist is set up by startup.el, but +;; only after it runs before-init-hook and after-init-hook. +(defun msdos-setup-initial-frame () + (modify-frame-parameters terminal-frame default-frame-alist) + ;; This remembers the screen colors after applying default-frame-alist, + ;; so that all subsequent frames could begin with those colors. + (msdos-remember-default-colors terminal-frame) + (modify-frame-parameters terminal-frame initial-frame-alist) + (msdos-handle-reverse-video terminal-frame + (frame-parameters terminal-frame)) + + (frame-set-background-mode terminal-frame) + (face-set-after-frame-default terminal-frame)) + +(add-hook 'term-setup-hook 'msdos-setup-initial-frame) + ;; We create frames as if we were a terminal, but with a twist. (defun make-msdos-frame (&optional parameters) - (let* ((parms - (append initial-frame-alist default-frame-alist parameters nil)) - (frame (make-terminal-frame parms)) - success) + (let ((frame (make-terminal-frame parameters)) + success) (unwind-protect (progn - (x-handle-reverse-video frame parms) + (msdos-handle-reverse-video frame (frame-parameters frame)) (frame-set-background-mode frame) (face-set-after-frame-default frame) (setq success t)) @@ -346,12 +136,10 @@ ;; a useful function for returning 'nil regardless of argument. ;; From src/xfns.c -(defun x-display-color-p (&optional display) 't) (defun x-list-fonts (pattern &optional face frame maximum width) (if (or (null width) (and (numberp width) (= width 1))) (list "ms-dos") (list "no-such-font"))) -(defun x-color-defined-p (color) (numberp (msdos-color-translate color))) (defun x-display-pixel-width (&optional frame) (frame-width frame)) (defun x-display-pixel-height (&optional frame) (frame-height frame)) (defun x-display-planes (&optional frame) 4) ;bg switched to 16 colors as well @@ -367,33 +155,12 @@ (fset 'x-display-save-under 'ignore) (fset 'x-get-resource 'ignore) -(defun x-color-values (color &optional frame) - "Return a description of the color named COLOR on frame FRAME.\n\ -The value is a list of integer RGB values--(RED GREEN BLUE).\n\ -These values range from 0 to 255; white is (255 255 255).\n\ -If FRAME is omitted or nil, use the selected frame." - (if (x-color-defined-p color) - (let ((frame (or frame (selected-frame))) - (color-code (msdos-color-translate color))) - (cdr (nth color-code msdos-color-values))))) - ;; From lisp/term/x-win.el -(setq x-display-name "pc") +(defvar x-display-name "pc" + "The display name specifying the MS-DOS display and frame type.") (setq split-window-keep-point t) (defvar x-colors (mapcar 'car msdos-color-values) "The list of colors available on a PC display under MS-DOS.") -(defun x-defined-colors (&optional frame) - "Return a list of colors supported for a particular frame. -The argument FRAME specifies which frame to try. -The value may be different for frames on different X displays." - x-colors) - -(defun face-color-supported-p (color) - (x-color-defined-p color)) - -(defun face-color-gray-p (color) - (member (msdos-color-translate color) - '("black" "lightgray" "darkgray" "white"))) ;; From lisp/term/w32-win.el ;
--- /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)))
--- a/lisp/term/w32-win.el Mon Dec 06 17:52:27 1999 +0000 +++ b/lisp/term/w32-win.el Mon Dec 06 17:55:00 1999 +0000 @@ -517,10 +517,8 @@ "GreenYellow") "The full list of X colors from the `rgb.text' file.") -(defun x-defined-colors (&optional frame) - "Return a list of colors supported for a particular frame. -The argument FRAME specifies which frame to try. -The value may be different for frames on different X displays." +(defun xw-defined-colors (&optional frame) + "Internal function called by `defined-colors', which see." (or frame (setq frame (selected-frame))) (let* ((color-map-colors (mapcar (lambda (clr) (car clr)) w32-color-map)) (all-colors (or color-map-colors x-colors))
--- a/lisp/term/x-win.el Mon Dec 06 17:52:27 1999 +0000 +++ b/lisp/term/x-win.el Mon Dec 06 17:55:00 1999 +0000 @@ -428,10 +428,8 @@ "GreenYellow") "The list of X colors from the `rgb.txt' file.") -(defun x-defined-colors (&optional frame) - "Return a list of colors supported for a particular frame. -The argument FRAME specifies which frame to try. -The value may be different for frames on different X displays." +(defun xw-defined-colors (&optional frame) + "Internal function called by `defined-colors', which see." (or frame (setq frame (selected-frame))) (let ((all-colors x-colors) (this-color nil)