Mercurial > emacs
comparison lisp/international/encoded-kb.el @ 83325:9e41c80c6389
Work around nondeterministic binding of terminal-local variables. (Fixes national character input on ttys.)
* src/data.c (Fterminal_local_value, Fset_terminal_local_value): New functions.
(syms_of_data): Defsubr them.
* lisp/international/encoded-kb.el (encoded-kbd-setup-keymap): Add keymap
parameter. Use it instead of changing key-translation-map directly.
(encoded-kbd-setup-display): Use terminal-local-value and
set-terminal-local-value to access key-translation-map. Remove
debugging messages.
* lisp/international/mule.el (keyboard-coding-system): Test for
encoded-kbd-setup-display, not encoded-kbd-mode.
* src/keyboard.c (syms_of_keyboard): Expand docs of terminal-local
variables to warn about their random bindings.
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-365
author | Karoly Lorentey <lorentey@elte.hu> |
---|---|
date | Mon, 27 Jun 2005 02:08:34 +0000 |
parents | f6ed7ae6fa8d |
children | 6c13700d1c13 |
comparison
equal
deleted
inserted
replaced
83324:eed3bdcacf4d | 83325:9e41c80c6389 |
---|---|
171 (while (= (length (setq result (ccl-execute-on-string ccl vec str t))) 0) | 171 (while (= (length (setq result (ccl-execute-on-string ccl vec str t))) 0) |
172 (dotimes (i 9) (aset vec i nil)) | 172 (dotimes (i 9) (aset vec i nil)) |
173 (setq str (format "%s%c" str (read-char-exclusive)))) | 173 (setq str (format "%s%c" str (read-char-exclusive)))) |
174 (vector (aref result 0)))) | 174 (vector (aref result 0)))) |
175 | 175 |
176 (defun encoded-kbd-setup-keymap (coding) | 176 (defun encoded-kbd-setup-keymap (keymap coding) |
177 ;; At first, reset the keymap. | 177 ;; At first, reset the keymap. |
178 (define-key encoded-kbd-mode-map "\e" nil) | 178 (define-key encoded-kbd-mode-map "\e" nil) |
179 ;; Then setup the keymap according to the keyboard coding system. | 179 ;; Then setup the keymap according to the keyboard coding system. |
180 (cond | 180 (cond |
181 ((eq (coding-system-type coding) 1) ; SJIS | 181 ((eq (coding-system-type coding) 1) ; SJIS |
182 (let ((i 128)) | 182 (let ((i 128)) |
183 (while (< i 256) | 183 (while (< i 256) |
184 (define-key key-translation-map | 184 (define-key keymap |
185 (vector i) 'encoded-kbd-self-insert-sjis) | 185 (vector i) 'encoded-kbd-self-insert-sjis) |
186 (setq i (1+ i)))) | 186 (setq i (1+ i)))) |
187 8) | 187 8) |
188 | 188 |
189 ((eq (coding-system-type coding) 3) ; Big5 | 189 ((eq (coding-system-type coding) 3) ; Big5 |
190 (let ((i 161)) | 190 (let ((i 161)) |
191 (while (< i 255) | 191 (while (< i 255) |
192 (define-key key-translation-map | 192 (define-key keymap |
193 (vector i) 'encoded-kbd-self-insert-big5) | 193 (vector i) 'encoded-kbd-self-insert-big5) |
194 (setq i (1+ i)))) | 194 (setq i (1+ i)))) |
195 8) | 195 8) |
196 | 196 |
197 ((eq (coding-system-type coding) 2) ; ISO-2022 | 197 ((eq (coding-system-type coding) 2) ; ISO-2022 |
213 (aset encoded-kbd-iso2022-invocations 0 0) | 213 (aset encoded-kbd-iso2022-invocations 0 0) |
214 (if (aref encoded-kbd-iso2022-designations 1) | 214 (if (aref encoded-kbd-iso2022-designations 1) |
215 (aset encoded-kbd-iso2022-invocations 1 1)) | 215 (aset encoded-kbd-iso2022-invocations 1 1)) |
216 (when use-designation | 216 (when use-designation |
217 (define-key encoded-kbd-mode-map "\e" 'encoded-kbd-iso2022-esc-prefix) | 217 (define-key encoded-kbd-mode-map "\e" 'encoded-kbd-iso2022-esc-prefix) |
218 (define-key key-translation-map "\e" 'encoded-kbd-iso2022-esc-prefix)) | 218 (define-key keymap "\e" 'encoded-kbd-iso2022-esc-prefix)) |
219 (when (or (aref flags 2) (aref flags 3)) | 219 (when (or (aref flags 2) (aref flags 3)) |
220 (define-key key-translation-map | 220 (define-key keymap |
221 [?\216] 'encoded-kbd-iso2022-single-shift) | 221 [?\216] 'encoded-kbd-iso2022-single-shift) |
222 (define-key key-translation-map | 222 (define-key keymap |
223 [?\217] 'encoded-kbd-iso2022-single-shift)) | 223 [?\217] 'encoded-kbd-iso2022-single-shift)) |
224 (or (eq (aref flags 0) 'ascii) | 224 (or (eq (aref flags 0) 'ascii) |
225 (dotimes (i 96) | 225 (dotimes (i 96) |
226 (define-key key-translation-map | 226 (define-key keymap |
227 (vector (+ 32 i)) 'encoded-kbd-self-insert-iso2022-7bit))) | 227 (vector (+ 32 i)) 'encoded-kbd-self-insert-iso2022-7bit))) |
228 (if (aref flags 7) | 228 (if (aref flags 7) |
229 t | 229 t |
230 (dotimes (i 96) | 230 (dotimes (i 96) |
231 (define-key key-translation-map | 231 (define-key keymap |
232 (vector (+ 160 i)) 'encoded-kbd-self-insert-iso2022-8bit)) | 232 (vector (+ 160 i)) 'encoded-kbd-self-insert-iso2022-8bit)) |
233 8)))) | 233 8)))) |
234 | 234 |
235 ((eq (coding-system-type coding) 4) ; CCL-base | 235 ((eq (coding-system-type coding) 4) ; CCL-base |
236 (let ((valid-codes (or (coding-system-get coding 'valid-codes) | 236 (let ((valid-codes (or (coding-system-get coding 'valid-codes) |
241 (if (consp elt) | 241 (if (consp elt) |
242 (setq from (car elt) to (cdr elt)) | 242 (setq from (car elt) to (cdr elt)) |
243 (setq from (setq to elt))) | 243 (setq from (setq to elt))) |
244 (while (<= from to) | 244 (while (<= from to) |
245 (if (>= from 128) | 245 (if (>= from 128) |
246 (define-key key-translation-map | 246 (define-key keymap |
247 (vector from) 'encoded-kbd-self-insert-ccl)) | 247 (vector from) 'encoded-kbd-self-insert-ccl)) |
248 (setq from (1+ from)))) | 248 (setq from (1+ from)))) |
249 8)) | 249 8)) |
250 | 250 |
251 (t | 251 (t |
261 | 261 |
262 DISPLAY may be a display id, a frame, or nil for the selected frame's display." | 262 DISPLAY may be a display id, a frame, or nil for the selected frame's display." |
263 (let ((frame (if (framep display) display (car (frames-on-display-list display))))) | 263 (let ((frame (if (framep display) display (car (frames-on-display-list display))))) |
264 (when frame | 264 (when frame |
265 (with-selected-frame frame | 265 (with-selected-frame frame |
266 (message (format "encoded-kbd-setup-display %s %s %s" display frame key-translation-map)) | |
267 ;; Remove any previous encoded-kb keymap from key-translation-map. | 266 ;; Remove any previous encoded-kb keymap from key-translation-map. |
268 (let ((m key-translation-map)) | 267 (let ((m (terminal-local-value 'key-translation-map frame))) |
269 (if (equal (keymap-prompt m) "encoded-kb") | 268 (if (equal (keymap-prompt m) "encoded-kb") |
270 (setq key-translation-map (keymap-parent m)) | 269 (set-terminal-local-value 'key-translation-map frame (keymap-parent m)) |
271 (while (keymap-parent m) | 270 (while (keymap-parent m) |
272 (if (equal (keymap-prompt (keymap-parent m)) "encoded-kb") | 271 (if (equal (keymap-prompt (keymap-parent m)) "encoded-kb") |
273 (set-keymap-parent m (keymap-parent (keymap-parent m)))) | 272 (set-keymap-parent m (keymap-parent (keymap-parent m)))) |
274 (setq m (keymap-parent m))))) | 273 (setq m (keymap-parent m))))) |
275 | 274 |
276 (if (keyboard-coding-system) | 275 (if (keyboard-coding-system) |
277 ;; We are turning on Encoded-kbd mode. | 276 ;; We are turning on Encoded-kbd mode. |
278 (let ((coding (keyboard-coding-system)) | 277 (let ((coding (keyboard-coding-system)) |
279 (keymap (make-sparse-keymap "encoded-kb")) | 278 (keymap (make-sparse-keymap "encoded-kb")) |
280 result) | 279 result) |
281 (set-keymap-parent keymap key-translation-map) | 280 (set-keymap-parent keymap (terminal-local-value 'key-translation-map frame)) |
282 (setq key-translation-map keymap) | 281 (set-terminal-local-value 'key-translation-map frame keymap) |
283 (or saved-input-mode | 282 (or saved-input-mode |
284 (setq saved-input-mode (current-input-mode))) | 283 (setq saved-input-mode (current-input-mode))) |
285 (setq result (and coding (encoded-kbd-setup-keymap coding))) | 284 (setq result (and coding (encoded-kbd-setup-keymap keymap coding))) |
286 (if result | 285 (if result |
287 (if (eq result 8) | 286 (if (eq result 8) |
288 (set-input-mode | 287 (set-input-mode |
289 (nth 0 saved-input-mode) | 288 (nth 0 saved-input-mode) |
290 (nth 1 saved-input-mode) | 289 (nth 1 saved-input-mode) |
294 (error "Unsupported coding system in Encoded-kbd mode: %S" | 293 (error "Unsupported coding system in Encoded-kbd mode: %S" |
295 coding))) | 294 coding))) |
296 ;; We are turning off Encoded-kbd mode. | 295 ;; We are turning off Encoded-kbd mode. |
297 (and saved-input-mode | 296 (and saved-input-mode |
298 (apply 'set-input-mode saved-input-mode)) | 297 (apply 'set-input-mode saved-input-mode)) |
299 (setq saved-input-mode nil)) | 298 (setq saved-input-mode nil)))))) |
300 (when (not (eq (selected-frame) frame)) | |
301 (error "Anyátok picsája!")))))) | |
302 | 299 |
303 (provide 'encoded-kb) | 300 (provide 'encoded-kb) |
304 | 301 |
305 ;;; arch-tag: 76f0f9b3-65e7-45c3-b692-59509a87ad44 | 302 ;;; arch-tag: 76f0f9b3-65e7-45c3-b692-59509a87ad44 |
306 ;;; encoded-kb.el ends here | 303 ;;; encoded-kb.el ends here |