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