root/trunk/lisp/term/xterm.el

Revision 4220, 22.6 kB (checked in by miyoshi, 9 months ago)

Sync up with Emacs22.2.

  • Property svn:eol-style set to LF
Line 
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, 2008 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 3, 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 "\eO4P" [M-S-f1])
173       (define-key map "\eO4Q" [M-S-f2])
174       (define-key map "\eO4R" [M-S-f3])
175       (define-key map "\eO4S" [M-S-f4])
176       (define-key map "\e[15;4~" [M-S-f5])
177       (define-key map "\e[17;4~" [M-S-f6])
178       (define-key map "\e[18;4~" [M-S-f7])
179       (define-key map "\e[19;4~" [M-S-f8])
180       (define-key map "\e[20;4~" [M-S-f9])
181       (define-key map "\e[21;4~" [M-S-f10])
182       (define-key map "\e[23;4~" [M-S-f11])
183       (define-key map "\e[24;4~" [M-S-f12])
184
185       (define-key map "\eOA" [up])
186       (define-key map "\eOB" [down])
187       (define-key map "\eOC" [right])
188       (define-key map "\eOD" [left])
189       (define-key map "\eOF" [end])
190       (define-key map "\eOH" [home])
191
192       (define-key map "\e[1;2A" [S-up])
193       (define-key map "\e[1;2B" [S-down])
194       (define-key map "\e[1;2C" [S-right])
195       (define-key map "\e[1;2D" [S-left])
196       (define-key map "\e[1;2F" [S-end])
197       (define-key map "\e[1;2H" [S-home])
198
199       (define-key map "\e[1;4A" [M-S-up])
200       (define-key map "\e[1;4B" [M-S-down])
201       (define-key map "\e[1;4C" [M-S-right])
202       (define-key map "\e[1;4D" [M-S-left])
203       (define-key map "\e[1;4F" [M-S-end])
204       (define-key map "\e[1;4H" [M-S-home])
205
206       (define-key map "\e[1;5A" [C-up])
207       (define-key map "\e[1;5B" [C-down])
208       (define-key map "\e[1;5C" [C-right])
209       (define-key map "\e[1;5D" [C-left])
210       (define-key map "\e[1;5F" [C-end])
211       (define-key map "\e[1;5H" [C-home])
212
213       (define-key map "\e[1;6A" [C-S-up])
214       (define-key map "\e[1;6B" [C-S-down])
215       (define-key map "\e[1;6C" [C-S-right])
216       (define-key map "\e[1;6D" [C-S-left])
217       (define-key map "\e[1;6F" [C-S-end])
218       (define-key map "\e[1;6H" [C-S-home])
219
220       (define-key map "\e[1;7A" [C-M-up])
221       (define-key map "\e[1;7B" [C-M-down])
222       (define-key map "\e[1;7C" [C-M-right])
223       (define-key map "\e[1;7D" [C-M-left])
224       (define-key map "\e[1;7F" [C-M-end])
225       (define-key map "\e[1;7H" [C-M-home])
226
227       (define-key map "\e[1;8A" [C-M-S-up])
228       (define-key map "\e[1;8B" [C-M-S-down])
229       (define-key map "\e[1;8C" [C-M-S-right])
230       (define-key map "\e[1;8D" [C-M-S-left])
231       (define-key map "\e[1;8F" [C-M-S-end])
232       (define-key map "\e[1;8H" [C-M-S-home])
233
234       (define-key map "\e[1;3A" [A-up])
235       (define-key map "\e[1;3B" [A-down])
236       (define-key map "\e[1;3C" [A-right])
237       (define-key map "\e[1;3D" [A-left])
238       (define-key map "\e[1;3F" [A-end])
239       (define-key map "\e[1;3H" [A-home])
240
241       (define-key map "\e[2~" [insert])
242       (define-key map "\e[3~" [delete])
243       (define-key map "\e[5~" [prior])
244       (define-key map "\e[6~" [next])
245
246       (define-key map "\e[2;2~" [S-insert])
247       (define-key map "\e[3;2~" [S-delete])
248       (define-key map "\e[5;2~" [S-prior])
249       (define-key map "\e[6;2~" [S-next])
250
251       (define-key map "\e[2;4~" [M-S-insert])
252       (define-key map "\e[3;4~" [M-S-delete])
253       (define-key map "\e[5;4~" [M-S-prior])
254       (define-key map "\e[6;4~" [M-S-next])
255
256       (define-key map "\e[2;5~" [C-insert])
257       (define-key map "\e[3;5~" [C-delete])
258       (define-key map "\e[5;5~" [C-prior])
259       (define-key map "\e[6;5~" [C-next])
260
261       (define-key map "\e[2;6~" [C-S-insert])
262       (define-key map "\e[3;6~" [C-S-delete])
263       (define-key map "\e[5;6~" [C-S-prior])
264       (define-key map "\e[6;6~" [C-S-next])
265
266       (define-key map "\e[2;7~" [C-M-insert])
267       (define-key map "\e[3;7~" [C-M-delete])
268       (define-key map "\e[5;7~" [C-M-prior])
269       (define-key map "\e[6;7~" [C-M-next])
270
271       (define-key map "\e[2;8~" [C-M-S-insert])
272       (define-key map "\e[3;8~" [C-M-S-delete])
273       (define-key map "\e[5;8~" [C-M-S-prior])
274       (define-key map "\e[6;8~" [C-M-S-next])
275
276       (define-key map "\e[2;3~" [A-insert])
277       (define-key map "\e[3;3~" [A-delete])
278       (define-key map "\e[5;3~" [A-prior])
279       (define-key map "\e[6;3~" [A-next])
280
281       (define-key map "\e[4~" [select])
282       (define-key map "\e[29~" [print])
283
284       (define-key map "\eOj" [kp-multiply])
285       (define-key map "\eOk" [kp-add])
286       (define-key map "\eOl" [kp-separator])
287       (define-key map "\eOm" [kp-subtract])
288       (define-key map "\eOo" [kp-divide])
289       (define-key map "\eOp" [kp-0])
290       (define-key map "\eOq" [kp-1])
291       (define-key map "\eOr" [kp-2])
292       (define-key map "\eOs" [kp-3])
293       (define-key map "\eOt" [kp-4])
294       (define-key map "\eOu" [kp-5])
295       (define-key map "\eOv" [kp-6])
296       (define-key map "\eOw" [kp-7])
297       (define-key map "\eOx" [kp-8])
298       (define-key map "\eOy" [kp-9])
299
300       ;; These keys are available in xterm starting from version 216
301       ;; if the modifyOtherKeys resource is set to 1.
302
303       (define-key map "\e[27;5;9~"   [C-tab])
304       (define-key map "\e[27;5;13~"  [C-return])
305       (define-key map "\e[27;5;39~"  [?\C-\'])
306       (define-key map "\e[27;5;44~"  [?\C-,])
307       (define-key map "\e[27;5;45~"  [?\C--])
308       (define-key map "\e[27;5;46~"  [?\C-.])
309       (define-key map "\e[27;5;47~"  [?\C-/])
310       (define-key map "\e[27;5;48~"  [?\C-0])
311       (define-key map "\e[27;5;49~"  [?\C-1])
312       ;; Not all C-DIGIT keys have a distinct binding.
313       (define-key map "\e[27;5;57~"  [?\C-9])
314       (define-key map "\e[27;5;59~"  [?\C-\;])
315       (define-key map "\e[27;5;61~"  [?\C-=])
316       (define-key map "\e[27;5;92~"  [?\C-\\])
317
318       (define-key map "\e[27;6;33~"  [?\C-!])
319       (define-key map "\e[27;6;34~"  [?\C-\"])
320       (define-key map "\e[27;6;35~"  [?\C-#])
321       (define-key map "\e[27;6;36~"  [?\C-$])
322       (define-key map "\e[27;6;37~"  [?\C-%])
323       (define-key map "\e[27;6;38~"  [?\C-&])
324       (define-key map "\e[27;6;40~"  [?\C-\(])
325       (define-key map "\e[27;6;41~"  [?\C-\)])
326       (define-key map "\e[27;6;42~"  [?\C-*])
327       (define-key map "\e[27;6;43~"  [?\C-+])
328       (define-key map "\e[27;6;58~"  [?\C-:])
329       (define-key map "\e[27;6;60~"  [?\C-<])
330       (define-key map "\e[27;6;62~"  [?\C->])
331       (define-key map "\e[27;6;63~"  [(control ??)])
332
333       ;; These are the strings emitted for various C-M- combinations
334       ;; for keyboards that the Meta and Alt modifiers are on the same
335       ;; key (usually labeled "Alt").
336       (define-key map "\e[27;13;9~"  [C-M-tab])
337       (define-key map "\e[27;13;13~" [C-M-return])
338
339       (define-key map "\e[27;13;39~" [?\C-\M-\'])
340       (define-key map "\e[27;13;44~" [?\C-\M-,])
341       (define-key map "\e[27;13;45~" [?\C-\M--])
342       (define-key map "\e[27;13;46~" [?\C-\M-.])
343       (define-key map "\e[27;13;47~" [?\C-\M-/])
344       (define-key map "\e[27;13;48~" [?\C-\M-0])
345       (define-key map "\e[27;13;49~" [?\C-\M-1])
346       (define-key map "\e[27;13;50~" [?\C-\M-2])
347       (define-key map "\e[27;13;51~" [?\C-\M-3])
348       (define-key map "\e[27;13;52~" [?\C-\M-4])
349       (define-key map "\e[27;13;53~" [?\C-\M-5])
350       (define-key map "\e[27;13;54~" [?\C-\M-6])
351       (define-key map "\e[27;13;55~" [?\C-\M-7])
352       (define-key map "\e[27;13;56~" [?\C-\M-8])
353       (define-key map "\e[27;13;57~" [?\C-\M-9])
354       (define-key map "\e[27;13;59~" [?\C-\M-\;])
355       (define-key map "\e[27;13;61~" [?\C-\M-=])
356       (define-key map "\e[27;13;92~" [?\C-\M-\\])
357
358       (define-key map "\e[27;14;33~"  [?\C-\M-!])
359       (define-key map "\e[27;14;34~"  [?\C-\M-\"])
360       (define-key map "\e[27;14;35~"  [?\C-\M-#])
361       (define-key map "\e[27;14;36~"  [?\C-\M-$])
362       (define-key map "\e[27;14;37~"  [?\C-\M-%])
363       (define-key map "\e[27;14;38~"  [?\C-\M-&])
364       (define-key map "\e[27;14;40~"  [?\C-\M-\(])
365       (define-key map "\e[27;14;41~"  [?\C-\M-\)])
366       (define-key map "\e[27;14;42~"  [?\C-\M-*])
367       (define-key map "\e[27;14;43~"  [?\C-\M-+])
368       (define-key map "\e[27;14;58~"  [?\C-\M-:])
369       (define-key map "\e[27;14;60~"  [?\C-\M-<])
370       (define-key map "\e[27;14;62~"  [?\C-\M->])
371       (define-key map "\e[27;14;63~"  [(control meta ??)])
372
373       (define-key map "\e[27;7;9~"  [C-M-tab])
374       (define-key map "\e[27;7;13~" [C-M-return])
375
376       (define-key map "\e[27;7;32~" [?\C-\M-\s])
377       (define-key map "\e[27;7;39~" [?\C-\M-\'])
378       (define-key map "\e[27;7;44~" [?\C-\M-,])
379       (define-key map "\e[27;7;45~" [?\C-\M--])
380       (define-key map "\e[27;7;46~" [?\C-\M-.])
381       (define-key map "\e[27;7;47~" [?\C-\M-/])
382       (define-key map "\e[27;7;48~" [?\C-\M-0])
383       (define-key map "\e[27;7;49~" [?\C-\M-1])
384       (define-key map "\e[27;7;50~" [?\C-\M-2])
385       (define-key map "\e[27;7;51~" [?\C-\M-3])
386       (define-key map "\e[27;7;52~" [?\C-\M-4])
387       (define-key map "\e[27;7;53~" [?\C-\M-5])
388       (define-key map "\e[27;7;54~" [?\C-\M-6])
389       (define-key map "\e[27;7;55~" [?\C-\M-7])
390       (define-key map "\e[27;7;56~" [?\C-\M-8])
391       (define-key map "\e[27;7;57~" [?\C-\M-9])
392       (define-key map "\e[27;7;59~" [?\C-\M-\;])
393       (define-key map "\e[27;7;61~" [?\C-\M-=])
394       (define-key map "\e[27;7;92~" [?\C-\M-\\])
395
396       (define-key map "\e[27;8;33~"  [?\C-\M-!])
397       (define-key map "\e[27;8;34~"  [?\C-\M-\"])
398       (define-key map "\e[27;8;35~"  [?\C-\M-#])
399       (define-key map "\e[27;8;36~"  [?\C-\M-$])
400       (define-key map "\e[27;8;37~"  [?\C-\M-%])
401       (define-key map "\e[27;8;38~"  [?\C-\M-&])
402       (define-key map "\e[27;8;40~"  [?\C-\M-\(])
403       (define-key map "\e[27;8;41~"  [?\C-\M-\)])
404       (define-key map "\e[27;8;42~"  [?\C-\M-*])
405       (define-key map "\e[27;8;43~"  [?\C-\M-+])
406       (define-key map "\e[27;8;58~"  [?\C-\M-:])
407       (define-key map "\e[27;8;60~"  [?\C-\M-<])
408       (define-key map "\e[27;8;62~"  [?\C-\M->])
409       (define-key map "\e[27;8;63~"  [(control meta ??)])
410
411       (define-key map "\e[27;2;9~"   [S-tab])
412       (define-key map "\e[27;2;13~"  [S-return])
413
414       (define-key map "\e[27;6;9~"   [C-S-tab])
415       (define-key map "\e[27;6;13~"  [C-S-return])
416
417       ;; Other versions of xterm might emit these.
418       (define-key map "\e[A" [up])
419       (define-key map "\e[B" [down])
420       (define-key map "\e[C" [right])
421       (define-key map "\e[D" [left])
422       (define-key map "\e[1~" [home])
423
424       (define-key map "\eO2A" [S-up])
425       (define-key map "\eO2B" [S-down])
426       (define-key map "\eO2C" [S-right])
427       (define-key map "\eO2D" [S-left])
428       (define-key map "\eO2F" [S-end])
429       (define-key map "\eO2H" [S-home])
430
431       (define-key map "\eO5A" [C-up])
432       (define-key map "\eO5B" [C-down])
433       (define-key map "\eO5C" [C-right])
434       (define-key map "\eO5D" [C-left])
435       (define-key map "\eO5F" [C-end])
436       (define-key map "\eO5H" [C-home])
437
438       (define-key map "\e[11~" [f1])
439       (define-key map "\e[12~" [f2])
440       (define-key map "\e[13~" [f3])
441       (define-key map "\e[14~" [f4])
442
443       ;; Use inheritance to let the main keymap override those defaults.
444       ;; This way we don't override terminfo-derived settings or settings
445       ;; made in the .emacs file.
446       (set-keymap-parent map (keymap-parent function-key-map))
447       (set-keymap-parent function-key-map map))
448
449     ;; Do it!
450     (xterm-register-default-colors)
451     ;; This recomputes all the default faces given the colors we've just set up.
452     (tty-set-up-initial-frame-faces)))
453
454 ;; Set up colors, for those versions of xterm that support it.
455 (defvar xterm-standard-colors
456   ;; The names in the comments taken from XTerm-col.ad in the xterm
457   ;; distribution, see ftp://dickey.his.com/xterm/.  RGB values are
458   ;; from rgb.txt.
459   '(("black"          0 (  0   0   0))  ; black
460     ("red"            1 (205   0   0))  ; red3
461     ("green"          2 (  0 205   0))  ; green3
462     ("yellow"         3 (205 205   0))  ; yellow3
463     ("blue"           4 (  0   0 238))  ; blue2
464     ("magenta"        5 (205   0 205))  ; magenta3
465     ("cyan"           6 (  0 205 205))  ; cyan3
466     ("white"          7 (229 229 229))  ; gray90
467     ("brightblack"    8 (127 127 127))  ; gray50
468     ("brightred"      9 (255   0   0))  ; red
469     ("brightgreen"   10 (  0 255   0))  ; green
470     ("brightyellow"  11 (255 255   0))  ; yellow
471     ("brightblue"    12 (92   92 255))  ; rgb:5c/5c/ff
472     ("brightmagenta" 13 (255   0 255))  ; magenta
473     ("brightcyan"    14 (  0 255 255))  ; cyan
474     ("brightwhite"   15 (255 255 255))) ; white
475   "Names of 16 standard xterm/aixterm colors, their numbers, and RGB values.")
476
477 (defun xterm-rgb-convert-to-16bit (prim)
478   "Convert an 8-bit primary color value PRIM to a corresponding 16-bit value."
479   (logior prim (lsh prim 8)))
480
481 (defun xterm-register-default-colors ()
482   "Register the default set of colors for xterm or compatible emulator.
483
484 This function registers the number of colors returned by `display-color-cells'
485 for the currently selected frame.  The first 16 colors are taken from
486 `xterm-standard-colors', which see, while the rest are computed assuming
487 either the 88- or 256-color standard color scheme supported by latest
488 versions of xterm."
489   (let* ((ncolors (display-color-cells))
490          (colors xterm-standard-colors)
491          (color (car colors)))
492     (if (> ncolors 0)
493         ;; Clear the 8 default tty colors registered by startup.el
494         (tty-color-clear))
495     ;; Only register as many colors as are supported by the display.
496     (while (and (> ncolors 0) colors)
497       (tty-color-define (car color) (cadr color)
498                         (mapcar 'xterm-rgb-convert-to-16bit
499                                 (car (cddr color))))
500       (setq colors (cdr colors)
501             color (car colors)
502             ncolors (1- ncolors)))
503     ;; We've exhausted the colors from `xterm-standard-colors'.  If there
504     ;; are more colors to support, compute them now.
505     (when (> ncolors 0)
506       (cond
507        ((= ncolors 240) ; 256-color xterm
508         ;; 216 non-gray colors first
509         (let ((r 0) (g 0) (b 0))
510           (while (> ncolors 24)
511             ;; This and other formulae taken from 256colres.pl and
512             ;; 88colres.pl in the xterm distribution.
513             (tty-color-define (format "color-%d" (- 256 ncolors))
514                               (- 256 ncolors)
515                               (mapcar 'xterm-rgb-convert-to-16bit
516                                       (list (if (zerop r) 0 (+ (* r 40) 55))
517                                             (if (zerop g) 0 (+ (* g 40) 55))
518                                             (if (zerop b) 0 (+ (* b 40) 55)))))
519
520             (setq b (1+ b))
521             (if (> b 5)
522                 (setq g (1+ g)
523                       b 0))
524             (if (> g 5)
525                 (setq r (1+ r)
526                       g 0))
527             (setq ncolors (1- ncolors))))
528         ;; Now the 24 gray colors
529         (while (> ncolors 0)
530           (setq color (xterm-rgb-convert-to-16bit (+ 8 (* (- 24 ncolors) 10))))
531           (tty-color-define (format "color-%d" (- 256 ncolors))
532                             (- 256 ncolors)
533                             (list color color color))
534           (setq ncolors (1- ncolors))))
535        ((= ncolors 72)  ; 88-color xterm
536         ;; 64 non-gray colors
537         (let ((levels '(0 139 205 255))
538               (r 0) (g 0) (b 0))
539           (while (> ncolors 8)
540             (tty-color-define (format "color-%d" (- 88 ncolors))
541                               (- 88 ncolors)
542                               (mapcar 'xterm-rgb-convert-to-16bit
543                                       (list (nth r levels)
544                                             (nth g levels)
545                                             (nth b levels))))
546             (setq b (1+ b))
547             (if (> b 3)
548                 (setq g (1+ g)
549                       b 0))
550             (if (> g 3)
551                 (setq r (1+ r)
552                       g 0))
553             (setq ncolors (1- ncolors))))
554         ;; Now the 8 gray colors
555         (while (> ncolors 0)
556           (setq color (xterm-rgb-convert-to-16bit
557                        (floor
558                         (if (= ncolors 8)
559                             46.36363636
560                           (+ (* (- 8 ncolors) 23.18181818) 69.54545454)))))
561           (tty-color-define (format "color-%d" (- 88 ncolors))
562                             (- 88 ncolors)
563                             (list color color color))
564           (setq ncolors (1- ncolors))))
565        (t (error "Unsupported number of xterm colors (%d)" (+ 16 ncolors)))))
566     ;; Modifying color mappings means realized faces don't use the
567     ;; right colors, so clear them.
568     (clear-face-cache)))
569
570 ;; arch-tag: 12e7ebdd-1e6c-4b25-b0f9-35ace25e855a
571 ;;; xterm.el ends here
572
Note: See TracBrowser for help on using the browser.