Remove clone-number support. Provide clone-of parameter in window states.
[bpt/emacs.git] / lisp / disp-table.el
CommitLineData
55535639 1;;; disp-table.el --- functions for dealing with char tables
c0274f38 2
95df8112
GM
3;; Copyright (C) 1987, 1994-1995, 1999, 2001-2011
4;; Free Software Foundation, Inc.
9750e079 5
ef9c36a5
EN
6;; Author: Erik Naggum <erik@naggum.no>
7;; Based on a previous version by Howard Gayle
e5167999 8;; Maintainer: FSF
a1d15b3e 9;; Keywords: i18n
bd78fa1d 10;; Package: emacs
a2535589
JA
11
12;; This file is part of GNU Emacs.
13
eb3fa2cf 14;; GNU Emacs is free software: you can redistribute it and/or modify
a2535589 15;; it under the terms of the GNU General Public License as published by
eb3fa2cf
GM
16;; the Free Software Foundation, either version 3 of the License, or
17;; (at your option) any later version.
a2535589
JA
18
19;; GNU Emacs is distributed in the hope that it will be useful,
20;; but WITHOUT ANY WARRANTY; without even the implied warranty of
21;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22;; GNU General Public License for more details.
23
24;; You should have received a copy of the GNU General Public License
eb3fa2cf 25;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
a2535589 26
55535639
PJ
27;;; Commentary:
28
e5167999 29;;; Code:
a2535589 30
963fd070 31(put 'display-table 'char-table-extra-slots 6)
dc5a82ea 32
ef9c36a5
EN
33;;;###autoload
34(defun make-display-table ()
35 "Return a new, empty display table."
963fd070 36 (make-char-table 'display-table nil))
ef9c36a5
EN
37
38(or standard-display-table
39 (setq standard-display-table (make-display-table)))
40
963fd070
RS
41;;; Display-table slot names. The property value says which slot.
42
43(put 'truncation 'display-table-slot 0)
44(put 'wrap 'display-table-slot 1)
45(put 'escape 'display-table-slot 2)
46(put 'control 'display-table-slot 3)
47(put 'selective-display 'display-table-slot 4)
48(put 'vertical-border 'display-table-slot 5)
ef9c36a5
EN
49
50;;;###autoload
51(defun display-table-slot (display-table slot)
52 "Return the value of the extra slot in DISPLAY-TABLE named SLOT.
12c9fbcc
EN
53SLOT may be a number from 0 to 5 inclusive, or a slot name (symbol).
54Valid symbols are `truncation', `wrap', `escape', `control',
55`selective-display', and `vertical-border'."
ef9c36a5
EN
56 (let ((slot-number
57 (if (numberp slot) slot
963fd070 58 (or (get slot 'display-table-slot)
ef9c36a5
EN
59 (error "Invalid display-table slot name: %s" slot)))))
60 (char-table-extra-slot display-table slot-number)))
61
62;;;###autoload
63(defun set-display-table-slot (display-table slot value)
64 "Set the value of the extra slot in DISPLAY-TABLE named SLOT to VALUE.
65SLOT may be a number from 0 to 5 inclusive, or a name (symbol).
12c9fbcc
EN
66Valid symbols are `truncation', `wrap', `escape', `control',
67`selective-display', and `vertical-border'."
963fd070
RS
68 (let ((slot-number
69 (if (numberp slot) slot
70 (or (get slot 'display-table-slot)
71 (error "Invalid display-table slot name: %s" slot)))))
72 (set-char-table-extra-slot display-table slot-number value)))
ef9c36a5
EN
73
74;;;###autoload
e31b61e6 75(defun describe-display-table (dt)
49116ac0 76 "Describe the display table DT in a help buffer."
e3d68257 77 (with-help-window "*Help*"
03131799 78 (princ "\nTruncation glyph: ")
963fd070 79 (prin1 (display-table-slot dt 'truncation))
03131799 80 (princ "\nWrap glyph: ")
963fd070 81 (prin1 (display-table-slot dt 'wrap))
03131799 82 (princ "\nEscape glyph: ")
963fd070 83 (prin1 (display-table-slot dt 'escape))
03131799 84 (princ "\nCtrl glyph: ")
963fd070 85 (prin1 (display-table-slot dt 'control))
afb1e4b4 86 (princ "\nSelective display glyph sequence: ")
963fd070 87 (prin1 (display-table-slot dt 'selective-display))
dc5a82ea 88 (princ "\nVertical window border glyph: ")
963fd070 89 (prin1 (display-table-slot dt 'vertical-border))
afb1e4b4 90 (princ "\nCharacter display glyph sequences:\n")
7fdbcd83 91 (with-current-buffer standard-output
bb6066c8
RS
92 (let ((vector (make-vector 256 nil))
93 (i 0))
94 (while (< i 256)
95 (aset vector i (aref dt i))
96 (setq i (1+ i)))
5d74f2a6 97 (describe-vector vector))
e3d68257 98 (help-mode))))
a2535589 99
e31b61e6 100;;;###autoload
a2535589 101(defun describe-current-display-table ()
bb6066c8
RS
102 "Describe the display table in use in the selected window and buffer."
103 (interactive)
ef9c36a5
EN
104 (let ((disptab (or (window-display-table (selected-window))
105 buffer-display-table
106 standard-display-table)))
bb6066c8
RS
107 (if disptab
108 (describe-display-table disptab)
109 (message "No display table"))))
a2535589 110
e31b61e6 111;;;###autoload
a2535589 112(defun standard-display-8bit (l h)
d419e1d9
KH
113 "Display characters representing raw bytes in the range L to H literally.
114
115On a terminal display, each character in the range is displayed
116by sending the corresponding byte directly to the terminal.
117
118On a graphic display, each character in the range is displayed
119using the default font by a glyph whose code is the corresponding
120byte.
121
122Note that ASCII printable characters (SPC to TILDA) are displayed
123in the default way after this call."
6b61353c
KH
124 (or standard-display-table
125 (setq standard-display-table (make-display-table)))
d419e1d9
KH
126 (if (> h 255)
127 (setq h 255))
a2535589 128 (while (<= l h)
d419e1d9
KH
129 (if (< l 128)
130 (aset standard-display-table l
131 (if (or (< l ?\s) (= l 127)) (vector l)))
132 (let ((c (unibyte-char-to-multibyte l)))
133 (aset standard-display-table c (vector c))))
a2535589
JA
134 (setq l (1+ l))))
135
798aa8d0
JB
136;;;###autoload
137(defun standard-display-default (l h)
138 "Display characters in the range L to H using the default notation."
6b61353c
KH
139 (or standard-display-table
140 (setq standard-display-table (make-display-table)))
798aa8d0 141 (while (<= l h)
a0451a71 142 (if (and (>= l ?\s) (characterp l))
1c2c3f16 143 (aset standard-display-table l nil))
798aa8d0
JB
144 (setq l (1+ l))))
145
a171458a
KH
146;; This function does NOT take terminal-dependent escape sequences.
147;; For that, you need to go through create-glyph. Use one of the
148;; other functions below, or roll your own.
ef9c36a5 149;;;###autoload
a2535589 150(defun standard-display-ascii (c s)
a171458a 151 "Display character C using printable string S."
6b61353c
KH
152 (or standard-display-table
153 (setq standard-display-table (make-display-table)))
ef9c36a5 154 (aset standard-display-table c (vconcat s)))
a2535589 155
e31b61e6 156;;;###autoload
a2535589 157(defun standard-display-g1 (c sc)
de7d5cb6
KH
158 "Display character C as character SC in the g1 character set.
159This function assumes that your terminal uses the SO/SI characters;
160it is meaningless for an X frame."
9e2a2647 161 (if (memq window-system '(x w32 ns))
de7d5cb6 162 (error "Cannot use string glyphs in a windowing system"))
6b61353c
KH
163 (or standard-display-table
164 (setq standard-display-table (make-display-table)))
a2535589 165 (aset standard-display-table c
82093c70 166 (vector (create-glyph (concat "\016" (char-to-string sc) "\017")))))
a2535589 167
e31b61e6 168;;;###autoload
a2535589 169(defun standard-display-graphic (c gc)
de7d5cb6
KH
170 "Display character C as character GC in graphics character set.
171This function assumes VT100-compatible escapes; it is meaningless for an
172X frame."
9e2a2647 173 (if (memq window-system '(x w32 ns))
de7d5cb6 174 (error "Cannot use string glyphs in a windowing system"))
6b61353c
KH
175 (or standard-display-table
176 (setq standard-display-table (make-display-table)))
a2535589 177 (aset standard-display-table c
82093c70 178 (vector (create-glyph (concat "\e(0" (char-to-string gc) "\e(B")))))
a2535589 179
e31b61e6 180;;;###autoload
a2535589
JA
181(defun standard-display-underline (c uc)
182 "Display character C as character UC plus underlining."
6b61353c
KH
183 (or standard-display-table
184 (setq standard-display-table (make-display-table)))
a2535589 185 (aset standard-display-table c
71296446 186 (vector
de7d5cb6 187 (if window-system
7dbfbd91 188 (make-glyph-code uc 'underline)
de7d5cb6 189 (create-glyph (concat "\e[4m" (char-to-string uc) "\e[m"))))))
03131799 190
e31b61e6 191;;;###autoload
03131799 192(defun create-glyph (string)
b8fbaf52 193 "Allocate a glyph code to display by sending STRING to the terminal."
03131799
RS
194 (if (= (length glyph-table) 65536)
195 (error "No free glyph codes remain"))
03fd83c5
KH
196 ;; Don't use slots that correspond to ASCII characters.
197 (if (= (length glyph-table) 32)
198 (setq glyph-table (vconcat glyph-table (make-vector 224 nil))))
03131799
RS
199 (setq glyph-table (vconcat glyph-table (list string)))
200 (1- (length glyph-table)))
a2535589 201
7dbfbd91
KS
202;;;###autoload
203(defun make-glyph-code (char &optional face)
204 "Return a glyph code representing char CHAR with face FACE."
205 ;; Due to limitations on Emacs integer values, faces with
7cc8cfc0 206 ;; face id greater that 512 are silently ignored.
20e70daf
KS
207 (if (not face)
208 char
209 (let ((fid (face-id face)))
e0c8ae10
JB
210 (if (< fid 64) ; we have 32 - 3(LSB) - 1(SIGN) - 22(CHAR) = 6 bits for face id
211 (logior char (lsh fid 22))
212 (cons char fid)))))
7dbfbd91
KS
213
214;;;###autoload
215(defun glyph-char (glyph)
216 "Return the character of glyph code GLYPH."
20e70daf
KS
217 (if (consp glyph)
218 (car glyph)
219 (logand glyph #x3fffff)))
7dbfbd91
KS
220
221;;;###autoload
222(defun glyph-face (glyph)
223 "Return the face of glyph code GLYPH, or nil if glyph has default face."
20e70daf 224 (let ((face-id (if (consp glyph) (cdr glyph) (lsh glyph -22))))
7dbfbd91 225 (and (> face-id 0)
e0c8ae10
JB
226 (catch 'face
227 (dolist (face (face-list))
228 (when (eq (face-id face) face-id)
229 (throw 'face face)))))))
7dbfbd91 230
2eae7226 231;;;###autoload
951bc45f 232(defun standard-display-european (arg)
3fbd8622 233 "Semi-obsolete way to toggle display of ISO 8859 European characters.
3ea1bd50 234
82e98df4
SM
235This function is semi-obsolete; you probably don't need it, or else you
236probably should use `set-language-environment' or `set-locale-environment'.
828fac3a 237
82e98df4
SM
238This function enables European character display if ARG is positive,
239disables it if negative. Otherwise, it toggles European character display.
b2b52747 240
3fbd8622
KH
241When this mode is enabled, characters in the range of 160 to 255
242display not as octal escapes, but as accented characters. Codes 146
243and 160 display as apostrophe and space, even though they are not the
244ASCII codes for apostrophe and space.
40e82ac1 245
3fbd8622 246Enabling European character display with this command noninteractively
82e98df4
SM
247from Lisp code also selects Latin-1 as the language environment.
248This provides increased compatibility for users who call this function
249in `.emacs'."
f5af76c2 250
c3a14a2b 251 (if (or (<= (prefix-numeric-value arg) 0)
2eae7226 252 (and (null arg)
ef9c36a5 253 (char-table-p standard-display-table)
55f5abaf 254 ;; Test 161, because 160 displays as a space.
d419e1d9
KH
255 (equal (aref standard-display-table
256 (unibyte-char-to-multibyte 161))
257 (vector (unibyte-char-to-multibyte 161)))))
3304a6c4 258 (progn
d419e1d9
KH
259 (standard-display-default
260 (unibyte-char-to-multibyte 160) (unibyte-char-to-multibyte 255))
9e2a2647 261 (unless (or (memq window-system '(x w32 ns)))
3fbd8622
KH
262 (and (terminal-coding-system)
263 (set-terminal-coding-system nil))))
6fbb1eb0
RS
264
265 (display-warning 'i18n
61af05c3 266 "`standard-display-european' is semi-obsolete; see its doc string for details"
6fbb1eb0 267 :warning)
fbd798e2
SM
268
269 ;; Switch to Latin-1 language environment
eb72c1bd 270 ;; unless some other has been specified.
fbd798e2
SM
271 (if (equal current-language-environment "English")
272 (set-language-environment "latin-1"))
9e2a2647 273 (unless (or noninteractive (memq window-system '(x w32 ns)))
951bc45f
PE
274 ;; Send those codes literally to a character-based terminal.
275 ;; If we are using single-byte characters,
276 ;; it doesn't matter which coding system we use.
4e633bb8 277 (set-terminal-coding-system
951bc45f
PE
278 (let ((c (intern (downcase current-language-environment))))
279 (if (coding-system-p c) c 'latin-1))))
eb72c1bd 280 (standard-display-european-internal)))
798aa8d0 281
a2535589 282(provide 'disp-table)
c0274f38
ER
283
284;;; disp-table.el ends here