1;;; xterm.el --- define function key sequences and standard colors for xterm
2
3;; Copyright (C) 1995, 2001, 2002, 2003, 2004, 2005,
4;;   2006, 2007 Free Software Foundation, Inc.
5
6;; Author: FSF
7;; Keywords: terminals
8
9;; This file is part of GNU Emacs.
10
11;; GNU Emacs is free software; you can redistribute it and/or modify
12;; it under the terms of the GNU General Public License as published by
13;; the Free Software Foundation; either version 2, or (at your option)
14;; any later version.
15
16;; GNU Emacs is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19;; GNU General Public License for more details.
20
21;; You should have received a copy of the GNU General Public License
22;; along with GNU Emacs; see the file COPYING.  If not, write to the
23;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24;; Boston, MA 02110-1301, USA.
25
26;;; Commentary:
27
28;;; Code:
29
30(defun terminal-init-xterm ()
31  "Terminal initialization function for xterm."
32  ;; rxvt terminals sometimes set the TERM variable to "xterm", but
33  ;; rxvt's keybindings that are incompatible with xterm's. It is
34  ;; better in that case to use rxvt's initializion function.
35  (if (and (getenv "COLORTERM")
36	   (string-match "\\`rxvt" (getenv "COLORTERM")))
37      (progn
38	(eval-and-compile (load "term/rxvt"))
39	(terminal-init-rxvt))
40
41    ;; The terminal intialization C code file might have initialized
42    ;; function keys F13->F60 from the termcap/terminfo information.  On
43    ;; a PC-style keyboard these keys correspond to
44    ;; MODIFIER-FUNCTION_KEY, where modifier is S-, C, A-, C-S-.  The
45    ;; code here subsitutes the corresponding defintions in
46    ;; function-key-map. This substitution is needed because if a key
47    ;; definition is found in function-key-map, there are no further
48    ;; lookups in other keymaps.
49    (substitute-key-definition [f13] [S-f1] function-key-map)
50    (substitute-key-definition [f14] [S-f2] function-key-map)
51    (substitute-key-definition [f15] [S-f3] function-key-map)
52    (substitute-key-definition [f16] [S-f4] function-key-map)
53    (substitute-key-definition [f17] [S-f5] function-key-map)
54    (substitute-key-definition [f18] [S-f6] function-key-map)
55    (substitute-key-definition [f19] [S-f7] function-key-map)
56    (substitute-key-definition [f20] [S-f8] function-key-map)
57    (substitute-key-definition [f21] [S-f9] function-key-map)
58    (substitute-key-definition [f22] [S-f10] function-key-map)
59    (substitute-key-definition [f23] [S-f11] function-key-map)
60    (substitute-key-definition [f24] [S-f12] function-key-map)
61
62    (substitute-key-definition [f25] [C-f1] function-key-map)
63    (substitute-key-definition [f26] [C-f2] function-key-map)
64    (substitute-key-definition [f27] [C-f3] function-key-map)
65    (substitute-key-definition [f28] [C-f4] function-key-map)
66    (substitute-key-definition [f29] [C-f5] function-key-map)
67    (substitute-key-definition [f30] [C-f6] function-key-map)
68    (substitute-key-definition [f31] [C-f7] function-key-map)
69    (substitute-key-definition [f32] [C-f8] function-key-map)
70    (substitute-key-definition [f33] [C-f9] function-key-map)
71    (substitute-key-definition [f34] [C-f10] function-key-map)
72    (substitute-key-definition [f35] [C-f11] function-key-map)
73    (substitute-key-definition [f36] [C-f12] function-key-map)
74
75    (substitute-key-definition [f37] [C-S-f1] function-key-map)
76    (substitute-key-definition [f38] [C-S-f2] function-key-map)
77    (substitute-key-definition [f39] [C-S-f3] function-key-map)
78    (substitute-key-definition [f40] [C-S-f4] function-key-map)
79    (substitute-key-definition [f41] [C-S-f5] function-key-map)
80    (substitute-key-definition [f42] [C-S-f6] function-key-map)
81    (substitute-key-definition [f43] [C-S-f7] function-key-map)
82    (substitute-key-definition [f44] [C-S-f8] function-key-map)
83    (substitute-key-definition [f45] [C-S-f9] function-key-map)
84    (substitute-key-definition [f46] [C-S-f10] function-key-map)
85    (substitute-key-definition [f47] [C-S-f11] function-key-map)
86    (substitute-key-definition [f48] [C-S-f12] function-key-map)
87
88    (substitute-key-definition [f49] [A-f1] function-key-map)
89    (substitute-key-definition [f50] [A-f2] function-key-map)
90    (substitute-key-definition [f51] [A-f3] function-key-map)
91    (substitute-key-definition [f52] [A-f4] function-key-map)
92    (substitute-key-definition [f53] [A-f5] function-key-map)
93    (substitute-key-definition [f54] [A-f6] function-key-map)
94    (substitute-key-definition [f55] [A-f7] function-key-map)
95    (substitute-key-definition [f56] [A-f8] function-key-map)
96    (substitute-key-definition [f57] [A-f9] function-key-map)
97    (substitute-key-definition [f58] [A-f10] function-key-map)
98    (substitute-key-definition [f59] [A-f11] function-key-map)
99    (substitute-key-definition [f60] [A-f12] function-key-map)
100
101    (let ((map (make-sparse-keymap)))
102      ;; xterm from X.org 6.8.2 uses these key definitions.
103      (define-key map "\eOP" [f1])
104      (define-key map "\eOQ" [f2])
105      (define-key map "\eOR" [f3])
106      (define-key map "\eOS" [f4])
107      (define-key map "\e[15~" [f5])
108      (define-key map "\e[17~" [f6])
109      (define-key map "\e[18~" [f7])
110      (define-key map "\e[19~" [f8])
111      (define-key map "\e[20~" [f9])
112      (define-key map "\e[21~" [f10])
113      (define-key map "\e[23~" [f11])
114      (define-key map "\e[24~" [f12])
115
116      (define-key map "\eO2P" [S-f1])
117      (define-key map "\eO2Q" [S-f2])
118      (define-key map "\eO2R" [S-f3])
119      (define-key map "\eO2S" [S-f4])
120      (define-key map "\e[1;2P" [S-f1])
121      (define-key map "\e[1;2Q" [S-f2])
122      (define-key map "\e[1;2R" [S-f3])
123      (define-key map "\e[1;2S" [S-f4])
124      (define-key map "\e[15;2~" [S-f5])
125      (define-key map "\e[17;2~" [S-f6])
126      (define-key map "\e[18;2~" [S-f7])
127      (define-key map "\e[19;2~" [S-f8])
128      (define-key map "\e[20;2~" [S-f9])
129      (define-key map "\e[21;2~" [S-f10])
130      (define-key map "\e[23;2~" [S-f11])
131      (define-key map "\e[24;2~" [S-f12])
132
133      (define-key map "\eO5P" [C-f1])
134      (define-key map "\eO5Q" [C-f2])
135      (define-key map "\eO5R" [C-f3])
136      (define-key map "\eO5S" [C-f4])
137      (define-key map "\e[15;5~" [C-f5])
138      (define-key map "\e[17;5~" [C-f6])
139      (define-key map "\e[18;5~" [C-f7])
140      (define-key map "\e[19;5~" [C-f8])
141      (define-key map "\e[20;5~" [C-f9])
142      (define-key map "\e[21;5~" [C-f10])
143      (define-key map "\e[23;5~" [C-f11])
144      (define-key map "\e[24;5~" [C-f12])
145
146      (define-key map "\eO6P" [C-S-f1])
147      (define-key map "\eO6Q" [C-S-f2])
148      (define-key map "\eO6R" [C-S-f3])
149      (define-key map "\eO6S" [C-S-f4])
150      (define-key map "\e[15;6~" [C-S-f5])
151      (define-key map "\e[17;6~" [C-S-f6])
152      (define-key map "\e[18;6~" [C-S-f7])
153      (define-key map "\e[19;6~" [C-S-f8])
154      (define-key map "\e[20;6~" [C-S-f9])
155      (define-key map "\e[21;6~" [C-S-f10])
156      (define-key map "\e[23;6~" [C-S-f11])
157      (define-key map "\e[24;6~" [C-S-f12])
158
159      (define-key map "\eO3P" [A-f1])
160      (define-key map "\eO3Q" [A-f2])
161      (define-key map "\eO3R" [A-f3])
162      (define-key map "\eO3S" [A-f4])
163      (define-key map "\e[15;3~" [A-f5])
164      (define-key map "\e[17;3~" [A-f6])
165      (define-key map "\e[18;3~" [A-f7])
166      (define-key map "\e[19;3~" [A-f8])
167      (define-key map "\e[20;3~" [A-f9])
168      (define-key map "\e[21;3~" [A-f10])
169      (define-key map "\e[23;3~" [A-f11])
170      (define-key map "\e[24;3~" [A-f12])
171
172      (define-key map "\eOA" [up])
173      (define-key map "\eOB" [down])
174      (define-key map "\eOC" [right])
175      (define-key map "\eOD" [left])
176      (define-key map "\eOF" [end])
177      (define-key map "\eOH" [home])
178
179      (define-key map "\e[1;2A" [S-up])
180      (define-key map "\e[1;2B" [S-down])
181      (define-key map "\e[1;2C" [S-right])
182      (define-key map "\e[1;2D" [S-left])
183      (define-key map "\e[1;2F" [S-end])
184      (define-key map "\e[1;2H" [S-home])
185
186      (define-key map "\e[1;5A" [C-up])
187      (define-key map "\e[1;5B" [C-down])
188      (define-key map "\e[1;5C" [C-right])
189      (define-key map "\e[1;5D" [C-left])
190      (define-key map "\e[1;5F" [C-end])
191      (define-key map "\e[1;5H" [C-home])
192
193      (define-key map "\e[1;6A" [C-S-up])
194      (define-key map "\e[1;6B" [C-S-down])
195      (define-key map "\e[1;6C" [C-S-right])
196      (define-key map "\e[1;6D" [C-S-left])
197      (define-key map "\e[1;6F" [C-S-end])
198      (define-key map "\e[1;6H" [C-S-home])
199
200      (define-key map "\e[1;3A" [A-up])
201      (define-key map "\e[1;3B" [A-down])
202      (define-key map "\e[1;3C" [A-right])
203      (define-key map "\e[1;3D" [A-left])
204      (define-key map "\e[1;3F" [A-end])
205      (define-key map "\e[1;3H" [A-home])
206
207      (define-key map "\e[2~" [insert])
208      (define-key map "\e[3~" [delete])
209      (define-key map "\e[5~" [prior])
210      (define-key map "\e[6~" [next])
211
212      (define-key map "\e[2;2~" [S-insert])
213      (define-key map "\e[3;2~" [S-delete])
214      (define-key map "\e[5;2~" [S-prior])
215      (define-key map "\e[6;2~" [S-next])
216
217      (define-key map "\e[2;5~" [C-insert])
218      (define-key map "\e[3;5~" [C-delete])
219      (define-key map "\e[5;5~" [C-prior])
220      (define-key map "\e[6;5~" [C-next])
221
222      (define-key map "\e[2;6~" [C-S-insert])
223      (define-key map "\e[3;6~" [C-S-delete])
224      (define-key map "\e[5;6~" [C-S-prior])
225      (define-key map "\e[6;6~" [C-S-next])
226
227      (define-key map "\e[2;3~" [A-insert])
228      (define-key map "\e[3;3~" [A-delete])
229      (define-key map "\e[5;3~" [A-prior])
230      (define-key map "\e[6;3~" [A-next])
231
232      (define-key map "\e[4~" [select])
233      (define-key map "\e[29~" [print])
234
235      (define-key map "\eOj" [kp-multiply])
236      (define-key map "\eOk" [kp-add])
237      (define-key map "\eOl" [kp-separator])
238      (define-key map "\eOm" [kp-subtract])
239      (define-key map "\eOo" [kp-divide])
240      (define-key map "\eOp" [kp-0])
241      (define-key map "\eOq" [kp-1])
242      (define-key map "\eOr" [kp-2])
243      (define-key map "\eOs" [kp-3])
244      (define-key map "\eOt" [kp-4])
245      (define-key map "\eOu" [kp-5])
246      (define-key map "\eOv" [kp-6])
247      (define-key map "\eOw" [kp-7])
248      (define-key map "\eOx" [kp-8])
249      (define-key map "\eOy" [kp-9])
250
251      ;; These keys are available in xterm starting from version 216
252      ;; if the modifyOtherKeys resource is set to 1.
253
254      (define-key map "\e[27;5;9~"   [C-tab])
255      (define-key map "\e[27;5;13~"  [C-return])
256      (define-key map "\e[27;5;39~"  [?\C-\'])
257      (define-key map "\e[27;5;44~"  [?\C-,])
258      (define-key map "\e[27;5;45~"  [?\C--])
259      (define-key map "\e[27;5;46~"  [?\C-.])
260      (define-key map "\e[27;5;47~"  [?\C-/])
261      (define-key map "\e[27;5;48~"  [?\C-0])
262      (define-key map "\e[27;5;49~"  [?\C-1])
263      ;; Not all C-DIGIT keys have a distinct binding.
264      (define-key map "\e[27;5;57~"  [?\C-9])
265      (define-key map "\e[27;5;59~"  [?\C-\;])
266      (define-key map "\e[27;5;61~"  [?\C-=])
267      (define-key map "\e[27;5;92~"  [?\C-\\])
268
269      (define-key map "\e[27;6;33~"  [?\C-!])
270      (define-key map "\e[27;6;34~"  [?\C-\"])
271      (define-key map "\e[27;6;35~"  [?\C-#])
272      (define-key map "\e[27;6;36~"  [?\C-$])
273      (define-key map "\e[27;6;37~"  [?\C-%])
274      (define-key map "\e[27;6;38~"  [?\C-&])
275      (define-key map "\e[27;6;40~"  [?\C-(])
276      (define-key map "\e[27;6;41~"  [?\C-)])
277      (define-key map "\e[27;6;42~"  [?\C-*])
278      (define-key map "\e[27;6;43~"  [?\C-+])
279      (define-key map "\e[27;6;58~"  [?\C-:])
280      (define-key map "\e[27;6;60~"  [?\C-<])
281      (define-key map "\e[27;6;62~"  [?\C->])
282      (define-key map "\e[27;6;63~"  [(control ??)])
283
284      ;; These are the strings emitted for various C-M- combinations
285      ;; for keyboards that the Meta and Alt modifiers are on the same
286      ;; key (usually labeled "Alt").
287      (define-key map "\e[27;13;9~"  [C-M-tab])
288      (define-key map "\e[27;13;13~" [C-M-return])
289
290      (define-key map "\e[27;13;39~" [?\C-\M-\'])
291      (define-key map "\e[27;13;44~" [?\C-\M-,])
292      (define-key map "\e[27;13;45~" [?\C-\M--])
293      (define-key map "\e[27;13;46~" [?\C-\M-.])
294      (define-key map "\e[27;13;47~" [?\C-\M-/])
295      (define-key map "\e[27;13;48~" [?\C-\M-0])
296      (define-key map "\e[27;13;49~" [?\C-\M-1])
297      (define-key map "\e[27;13;50~" [?\C-\M-2])
298      (define-key map "\e[27;13;51~" [?\C-\M-3])
299      (define-key map "\e[27;13;52~" [?\C-\M-4])
300      (define-key map "\e[27;13;53~" [?\C-\M-5])
301      (define-key map "\e[27;13;54~" [?\C-\M-6])
302      (define-key map "\e[27;13;55~" [?\C-\M-7])
303      (define-key map "\e[27;13;56~" [?\C-\M-8])
304      (define-key map "\e[27;13;57~" [?\C-\M-9])
305      (define-key map "\e[27;13;59~" [?\C-\M-\;])
306      (define-key map "\e[27;13;61~" [?\C-\M-=])
307      (define-key map "\e[27;13;92~" [?\C-\M-\\])
308
309      (define-key map "\e[27;14;33~"  [?\C-\M-!])
310      (define-key map "\e[27;14;34~"  [?\C-\M-\"])
311      (define-key map "\e[27;14;35~"  [?\C-\M-#])
312      (define-key map "\e[27;14;36~"  [?\C-\M-$])
313      (define-key map "\e[27;14;37~"  [?\C-\M-%])
314      (define-key map "\e[27;14;38~"  [?\C-\M-&])
315      (define-key map "\e[27;14;40~"  [?\C-\M-(])
316      (define-key map "\e[27;14;41~"  [?\C-\M-)])
317      (define-key map "\e[27;14;42~"  [?\C-\M-*])
318      (define-key map "\e[27;14;43~"  [?\C-\M-+])
319      (define-key map "\e[27;14;58~"  [?\C-\M-:])
320      (define-key map "\e[27;14;60~"  [?\C-\M-<])
321      (define-key map "\e[27;14;62~"  [?\C-\M->])
322      (define-key map "\e[27;14;63~"  [(control meta ??)])
323
324      (define-key map "\e[27;7;9~"  [C-M-tab])
325      (define-key map "\e[27;7;13~" [C-M-return])
326
327      (define-key map "\e[27;7;32~" [?\C-\M-\s])
328      (define-key map "\e[27;7;39~" [?\C-\M-\'])
329      (define-key map "\e[27;7;44~" [?\C-\M-,])
330      (define-key map "\e[27;7;45~" [?\C-\M--])
331      (define-key map "\e[27;7;46~" [?\C-\M-.])
332      (define-key map "\e[27;7;47~" [?\C-\M-/])
333      (define-key map "\e[27;7;48~" [?\C-\M-0])
334      (define-key map "\e[27;7;49~" [?\C-\M-1])
335      (define-key map "\e[27;7;50~" [?\C-\M-2])
336      (define-key map "\e[27;7;51~" [?\C-\M-3])
337      (define-key map "\e[27;7;52~" [?\C-\M-4])
338      (define-key map "\e[27;7;53~" [?\C-\M-5])
339      (define-key map "\e[27;7;54~" [?\C-\M-6])
340      (define-key map "\e[27;7;55~" [?\C-\M-7])
341      (define-key map "\e[27;7;56~" [?\C-\M-8])
342      (define-key map "\e[27;7;57~" [?\C-\M-9])
343      (define-key map "\e[27;7;59~" [?\C-\M-\;])
344      (define-key map "\e[27;7;61~" [?\C-\M-=])
345      (define-key map "\e[27;7;92~" [?\C-\M-\\])
346
347      (define-key map "\e[27;8;33~"  [?\C-\M-!])
348      (define-key map "\e[27;8;34~"  [?\C-\M-\"])
349      (define-key map "\e[27;8;35~"  [?\C-\M-#])
350      (define-key map "\e[27;8;36~"  [?\C-\M-$])
351      (define-key map "\e[27;8;37~"  [?\C-\M-%])
352      (define-key map "\e[27;8;38~"  [?\C-\M-&])
353      (define-key map "\e[27;8;40~"  [?\C-\M-(])
354      (define-key map "\e[27;8;41~"  [?\C-\M-)])
355      (define-key map "\e[27;8;42~"  [?\C-\M-*])
356      (define-key map "\e[27;8;43~"  [?\C-\M-+])
357      (define-key map "\e[27;8;58~"  [?\C-\M-:])
358      (define-key map "\e[27;8;60~"  [?\C-\M-<])
359      (define-key map "\e[27;8;62~"  [?\C-\M->])
360      (define-key map "\e[27;8;63~"  [(control meta ??)])
361
362      (define-key map "\e[27;2;9~"   [S-tab])
363      (define-key map "\e[27;2;13~"  [S-return])
364
365      (define-key map "\e[27;6;9~"   [C-S-tab])
366      (define-key map "\e[27;6;13~"  [C-S-return])
367
368      ;; Other versions of xterm might emit these.
369      (define-key map "\e[A" [up])
370      (define-key map "\e[B" [down])
371      (define-key map "\e[C" [right])
372      (define-key map "\e[D" [left])
373      (define-key map "\e[1~" [home])
374
375      (define-key map "\eO2A" [S-up])
376      (define-key map "\eO2B" [S-down])
377      (define-key map "\eO2C" [S-right])
378      (define-key map "\eO2D" [S-left])
379      (define-key map "\eO2F" [S-end])
380      (define-key map "\eO2H" [S-home])
381
382      (define-key map "\eO5A" [C-up])
383      (define-key map "\eO5B" [C-down])
384      (define-key map "\eO5C" [C-right])
385      (define-key map "\eO5D" [C-left])
386      (define-key map "\eO5F" [C-end])
387      (define-key map "\eO5H" [C-home])
388
389      (define-key map "\e[11~" [f1])
390      (define-key map "\e[12~" [f2])
391      (define-key map "\e[13~" [f3])
392      (define-key map "\e[14~" [f4])
393
394      ;; Use inheritance to let the main keymap override those defaults.
395      ;; This way we don't override terminfo-derived settings or settings
396      ;; made in the .emacs file.
397      (set-keymap-parent map (keymap-parent function-key-map))
398      (set-keymap-parent function-key-map map))
399
400    ;; Do it!
401    (xterm-register-default-colors)
402    ;; This recomputes all the default faces given the colors we've just set up.
403    (tty-set-up-initial-frame-faces)))
404
405;; Set up colors, for those versions of xterm that support it.
406(defvar xterm-standard-colors
407  ;; The names in the comments taken from XTerm-col.ad in the xterm
408  ;; distribution, see ftp://dickey.his.com/xterm/.  RGB values are
409  ;; from rgb.txt.
410  '(("black"          0 (  0   0   0))	; black
411    ("red"            1 (205   0   0))	; red3
412    ("green"          2 (  0 205   0))	; green3
413    ("yellow"         3 (205 205   0))	; yellow3
414    ("blue"           4 (  0   0 238))	; blue2
415    ("magenta"        5 (205   0 205))	; magenta3
416    ("cyan"           6 (  0 205 205))	; cyan3
417    ("white"          7 (229 229 229))	; gray90
418    ("brightblack"    8 (127 127 127))	; gray50
419    ("brightred"      9 (255   0   0))	; red
420    ("brightgreen"   10 (  0 255   0))	; green
421    ("brightyellow"  11 (255 255   0))	; yellow
422    ("brightblue"    12 (92   92 255))	; rgb:5c/5c/ff
423    ("brightmagenta" 13 (255   0 255))	; magenta
424    ("brightcyan"    14 (  0 255 255))	; cyan
425    ("brightwhite"   15 (255 255 255)))	; white
426  "Names of 16 standard xterm/aixterm colors, their numbers, and RGB values.")
427
428(defun xterm-rgb-convert-to-16bit (prim)
429  "Convert an 8-bit primary color value PRIM to a corresponding 16-bit value."
430  (logior prim (lsh prim 8)))
431
432(defun xterm-register-default-colors ()
433  "Register the default set of colors for xterm or compatible emulator.
434
435This function registers the number of colors returned by `display-color-cells'
436for the currently selected frame.  The first 16 colors are taken from
437`xterm-standard-colors', which see, while the rest are computed assuming
438either the 88- or 256-color standard color scheme supported by latest
439versions of xterm."
440  (let* ((ncolors (display-color-cells))
441	 (colors xterm-standard-colors)
442	 (color (car colors)))
443    (if (> ncolors 0)
444	;; Clear the 8 default tty colors registered by startup.el
445	(tty-color-clear))
446    ;; Only register as many colors as are supported by the display.
447    (while (and (> ncolors 0) colors)
448      (tty-color-define (car color) (cadr color)
449			(mapcar 'xterm-rgb-convert-to-16bit
450				(car (cddr color))))
451      (setq colors (cdr colors)
452	    color (car colors)
453	    ncolors (1- ncolors)))
454    ;; We've exhausted the colors from `xterm-standard-colors'.  If there
455    ;; are more colors to support, compute them now.
456    (when (> ncolors 0)
457      (cond
458       ((= ncolors 240)	; 256-color xterm
459	;; 216 non-gray colors first
460	(let ((r 0) (g 0) (b 0))
461	  (while (> ncolors 24)
462	    ;; This and other formulae taken from 256colres.pl and
463	    ;; 88colres.pl in the xterm distribution.
464	    (tty-color-define (format "color-%d" (- 256 ncolors))
465			      (- 256 ncolors)
466			      (mapcar 'xterm-rgb-convert-to-16bit
467				      (list (if (zerop r) 0 (+ (* r 40) 55))
468					    (if (zerop g) 0 (+ (* g 40) 55))
469					    (if (zerop b) 0 (+ (* b 40) 55)))))
470
471	    (setq b (1+ b))
472	    (if (> b 5)
473		(setq g (1+ g)
474		      b 0))
475	    (if (> g 5)
476		(setq r (1+ r)
477		      g 0))
478	    (setq ncolors (1- ncolors))))
479	;; Now the 24 gray colors
480	(while (> ncolors 0)
481	  (setq color (xterm-rgb-convert-to-16bit (+ 8 (* (- 24 ncolors) 10))))
482	  (tty-color-define (format "color-%d" (- 256 ncolors))
483			    (- 256 ncolors)
484			    (list color color color))
485	  (setq ncolors (1- ncolors))))
486       ((= ncolors 72)  ; 88-color xterm
487	;; 64 non-gray colors
488	(let ((levels '(0 139 205 255))
489	      (r 0) (g 0) (b 0))
490	  (while (> ncolors 8)
491	    (tty-color-define (format "color-%d" (- 88 ncolors))
492			      (- 88 ncolors)
493			      (mapcar 'xterm-rgb-convert-to-16bit
494				      (list (nth r levels)
495					    (nth g levels)
496					    (nth b levels))))
497	    (setq b (1+ b))
498	    (if (> b 3)
499		(setq g (1+ g)
500		      b 0))
501	    (if (> g 3)
502		(setq r (1+ r)
503		      g 0))
504	    (setq ncolors (1- ncolors))))
505	;; Now the 8 gray colors
506	(while (> ncolors 0)
507	  (setq color (xterm-rgb-convert-to-16bit
508		       (floor
509			(if (= ncolors 8)
510			    46.36363636
511			  (+ (* (- 8 ncolors) 23.18181818) 69.54545454)))))
512	  (tty-color-define (format "color-%d" (- 88 ncolors))
513			    (- 88 ncolors)
514			    (list color color color))
515	  (setq ncolors (1- ncolors))))
516       (t (error "Unsupported number of xterm colors (%d)" (+ 16 ncolors)))))
517    ;; Modifying color mappings means realized faces don't use the
518    ;; right colors, so clear them.
519    (clear-face-cache)))
520
521;; arch-tag: 12e7ebdd-1e6c-4b25-b0f9-35ace25e855a
522;;; xterm.el ends here
523