mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-15 10:30:25 -08:00
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
This commit is contained in:
parent
e589efa546
commit
2a42d44084
5 changed files with 112 additions and 33 deletions
|
|
@ -325,10 +325,16 @@ following:
|
|||
alias gnus="connect-emacs gnus"
|
||||
|
||||
|
||||
CHANGELOG
|
||||
---------
|
||||
|
||||
See arch logs.
|
||||
|
||||
|
||||
NEWS
|
||||
----
|
||||
|
||||
For the NEWS file: (Needs work)
|
||||
For the NEWS file: (Needs much, much work)
|
||||
|
||||
** Support for multiple terminal devices has been added.
|
||||
|
||||
|
|
@ -346,12 +352,13 @@ For the NEWS file: (Needs work)
|
|||
*** A make-frame-on-tty function has been added to make it easier to
|
||||
create frames on new terminals.
|
||||
|
||||
*** New functions: frame-tty-name, frame-tty-type for accessing
|
||||
terminal parameters, and delete-tty for closing the terminal
|
||||
device.
|
||||
*** New functions: frame-tty-name, frame-tty-type, delete-tty,
|
||||
terminal-local-value, set-terminal-local-value
|
||||
|
||||
*** talk.el has been extended for multiple tty support.
|
||||
*** New variables: global-key-translation-map
|
||||
|
||||
*** The keymaps key-translation-map and function-key-map are now
|
||||
terminal-local.
|
||||
|
||||
** Support for simultaneous graphical and terminal frames has been
|
||||
added.
|
||||
|
|
@ -364,10 +371,8 @@ For the NEWS file: (Needs work)
|
|||
*** The new `initial-window-system' variable contains the
|
||||
`window-system' value for the first frame.
|
||||
|
||||
CHANGELOG
|
||||
---------
|
||||
*** talk.el has been extended for multiple tty support.
|
||||
|
||||
See arch logs.
|
||||
|
||||
* * *
|
||||
|
||||
|
|
@ -1073,4 +1078,17 @@ DIARY OF CHANGES
|
|||
(Done, by making `function-key-map' terminal-local (i.e., part of
|
||||
struct kboard). This has probably covered all the remaining problems.)
|
||||
|
||||
-- Make `function-key-map' and `key-translation-map' terminal-local.
|
||||
|
||||
(Done.)
|
||||
|
||||
-- Implement `terminal-local-value' and `set-terminal-local-value' to
|
||||
allow deterministic access to terminal local bindings. The
|
||||
encode-kb package can not set up `key-translation-map' without
|
||||
these. The terminal-local bindings seem to be independent of what
|
||||
frame is selected.
|
||||
|
||||
(Done.)
|
||||
|
||||
;;; arch-tag: 8da1619e-2e79-41a8-9ac9-a0485daad17d
|
||||
|
||||
|
|
|
|||
|
|
@ -173,7 +173,7 @@ The following key sequence may cause multilingual text insertion."
|
|||
(setq str (format "%s%c" str (read-char-exclusive))))
|
||||
(vector (aref result 0))))
|
||||
|
||||
(defun encoded-kbd-setup-keymap (coding)
|
||||
(defun encoded-kbd-setup-keymap (keymap coding)
|
||||
;; At first, reset the keymap.
|
||||
(define-key encoded-kbd-mode-map "\e" nil)
|
||||
;; Then setup the keymap according to the keyboard coding system.
|
||||
|
|
@ -181,7 +181,7 @@ The following key sequence may cause multilingual text insertion."
|
|||
((eq (coding-system-type coding) 1) ; SJIS
|
||||
(let ((i 128))
|
||||
(while (< i 256)
|
||||
(define-key key-translation-map
|
||||
(define-key keymap
|
||||
(vector i) 'encoded-kbd-self-insert-sjis)
|
||||
(setq i (1+ i))))
|
||||
8)
|
||||
|
|
@ -189,7 +189,7 @@ The following key sequence may cause multilingual text insertion."
|
|||
((eq (coding-system-type coding) 3) ; Big5
|
||||
(let ((i 161))
|
||||
(while (< i 255)
|
||||
(define-key key-translation-map
|
||||
(define-key keymap
|
||||
(vector i) 'encoded-kbd-self-insert-big5)
|
||||
(setq i (1+ i))))
|
||||
8)
|
||||
|
|
@ -215,20 +215,20 @@ The following key sequence may cause multilingual text insertion."
|
|||
(aset encoded-kbd-iso2022-invocations 1 1))
|
||||
(when use-designation
|
||||
(define-key encoded-kbd-mode-map "\e" 'encoded-kbd-iso2022-esc-prefix)
|
||||
(define-key key-translation-map "\e" 'encoded-kbd-iso2022-esc-prefix))
|
||||
(define-key keymap "\e" 'encoded-kbd-iso2022-esc-prefix))
|
||||
(when (or (aref flags 2) (aref flags 3))
|
||||
(define-key key-translation-map
|
||||
(define-key keymap
|
||||
[?\216] 'encoded-kbd-iso2022-single-shift)
|
||||
(define-key key-translation-map
|
||||
(define-key keymap
|
||||
[?\217] 'encoded-kbd-iso2022-single-shift))
|
||||
(or (eq (aref flags 0) 'ascii)
|
||||
(dotimes (i 96)
|
||||
(define-key key-translation-map
|
||||
(define-key keymap
|
||||
(vector (+ 32 i)) 'encoded-kbd-self-insert-iso2022-7bit)))
|
||||
(if (aref flags 7)
|
||||
t
|
||||
(dotimes (i 96)
|
||||
(define-key key-translation-map
|
||||
(define-key keymap
|
||||
(vector (+ 160 i)) 'encoded-kbd-self-insert-iso2022-8bit))
|
||||
8))))
|
||||
|
||||
|
|
@ -243,7 +243,7 @@ The following key sequence may cause multilingual text insertion."
|
|||
(setq from (setq to elt)))
|
||||
(while (<= from to)
|
||||
(if (>= from 128)
|
||||
(define-key key-translation-map
|
||||
(define-key keymap
|
||||
(vector from) 'encoded-kbd-self-insert-ccl))
|
||||
(setq from (1+ from))))
|
||||
8))
|
||||
|
|
@ -263,11 +263,10 @@ DISPLAY may be a display id, a frame, or nil for the selected frame's display."
|
|||
(let ((frame (if (framep display) display (car (frames-on-display-list display)))))
|
||||
(when frame
|
||||
(with-selected-frame frame
|
||||
(message (format "encoded-kbd-setup-display %s %s %s" display frame key-translation-map))
|
||||
;; Remove any previous encoded-kb keymap from key-translation-map.
|
||||
(let ((m key-translation-map))
|
||||
(let ((m (terminal-local-value 'key-translation-map frame)))
|
||||
(if (equal (keymap-prompt m) "encoded-kb")
|
||||
(setq key-translation-map (keymap-parent m))
|
||||
(set-terminal-local-value 'key-translation-map frame (keymap-parent m))
|
||||
(while (keymap-parent m)
|
||||
(if (equal (keymap-prompt (keymap-parent m)) "encoded-kb")
|
||||
(set-keymap-parent m (keymap-parent (keymap-parent m))))
|
||||
|
|
@ -278,11 +277,11 @@ DISPLAY may be a display id, a frame, or nil for the selected frame's display."
|
|||
(let ((coding (keyboard-coding-system))
|
||||
(keymap (make-sparse-keymap "encoded-kb"))
|
||||
result)
|
||||
(set-keymap-parent keymap key-translation-map)
|
||||
(setq key-translation-map keymap)
|
||||
(set-keymap-parent keymap (terminal-local-value 'key-translation-map frame))
|
||||
(set-terminal-local-value 'key-translation-map frame keymap)
|
||||
(or saved-input-mode
|
||||
(setq saved-input-mode (current-input-mode)))
|
||||
(setq result (and coding (encoded-kbd-setup-keymap coding)))
|
||||
(setq result (and coding (encoded-kbd-setup-keymap keymap coding)))
|
||||
(if result
|
||||
(if (eq result 8)
|
||||
(set-input-mode
|
||||
|
|
@ -296,9 +295,7 @@ DISPLAY may be a display id, a frame, or nil for the selected frame's display."
|
|||
;; We are turning off Encoded-kbd mode.
|
||||
(and saved-input-mode
|
||||
(apply 'set-input-mode saved-input-mode))
|
||||
(setq saved-input-mode nil))
|
||||
(when (not (eq (selected-frame) frame))
|
||||
(error "Anyátok picsája!"))))))
|
||||
(setq saved-input-mode nil))))))
|
||||
|
||||
(provide 'encoded-kb)
|
||||
|
||||
|
|
|
|||
|
|
@ -1272,8 +1272,8 @@ use either \\[customize] or \\[set-keyboard-coding-system]."
|
|||
:link '(info-link "(emacs)Specify Coding")
|
||||
:link '(info-link "(emacs)Single-Byte Character Support")
|
||||
:set (lambda (symbol value)
|
||||
;; Don't load encoded-kbd-mode unnecessarily.
|
||||
(if (or value (boundp 'encoded-kbd-mode))
|
||||
;; Don't load encoded-kb unnecessarily.
|
||||
(if (or value (boundp 'encoded-kbd-setup-display))
|
||||
(set-keyboard-coding-system value)
|
||||
(set-default 'keyboard-coding-system nil))) ; must initialize
|
||||
:version "22.1"
|
||||
|
|
|
|||
40
src/data.c
40
src/data.c
|
|
@ -1875,6 +1875,44 @@ If the current binding is global (the default), the value is nil. */)
|
|||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
extern struct display *get_display P_ ((Lisp_Object display, int));
|
||||
|
||||
DEFUN ("terminal-local-value", Fterminal_local_value, Sterminal_local_value, 2, 2, 0,
|
||||
doc: /* Return the terminal-local value of SYMBOL on DISPLAY.
|
||||
If SYMBOL is not a terminal-local variable, then return its normal
|
||||
value, like `symbol-value'.
|
||||
|
||||
DISPLAY may be a display, a frame, or nil (meaning the selected
|
||||
frame's display). */)
|
||||
(symbol, display)
|
||||
Lisp_Object symbol;
|
||||
Lisp_Object display;
|
||||
{
|
||||
Lisp_Object result;
|
||||
struct display *d = get_display (display, 1);
|
||||
push_display_kboard (d);
|
||||
result = Fsymbol_value (symbol);
|
||||
pop_frame_kboard ();
|
||||
return result;
|
||||
}
|
||||
|
||||
DEFUN ("set-terminal-local-value", Fset_terminal_local_value, Sset_terminal_local_value, 3, 3, 0,
|
||||
doc: /* Set the terminal-local binding of SYMBOL on DISPLAY to VALUE.
|
||||
If VARIABLE is not a terminal-local variable, then set its normal
|
||||
binding, like `set'. */)
|
||||
(symbol, display, value)
|
||||
Lisp_Object symbol;
|
||||
Lisp_Object display;
|
||||
Lisp_Object value;
|
||||
{
|
||||
Lisp_Object result;
|
||||
struct display *d = get_display (display, 1);
|
||||
push_display_kboard (d);
|
||||
result = Fset (symbol, value);
|
||||
pop_frame_kboard ();
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Find the function at the end of a chain of symbol function indirections. */
|
||||
|
||||
|
|
@ -3326,6 +3364,8 @@ syms_of_data ()
|
|||
defsubr (&Slocal_variable_p);
|
||||
defsubr (&Slocal_variable_if_set_p);
|
||||
defsubr (&Svariable_binding_locus);
|
||||
defsubr (&Sterminal_local_value);
|
||||
defsubr (&Sset_terminal_local_value);
|
||||
defsubr (&Saref);
|
||||
defsubr (&Saset);
|
||||
defsubr (&Snumber_to_string);
|
||||
|
|
|
|||
|
|
@ -11247,7 +11247,10 @@ In other words, the present command is the event that made the previous
|
|||
command exit.
|
||||
|
||||
The value `kill-region' is special; it means that the previous command
|
||||
was a kill command. */);
|
||||
was a kill command.
|
||||
|
||||
`last-command' has a separate binding for each display device.
|
||||
See Info node `(elisp)Multiple displays'. */);
|
||||
|
||||
DEFVAR_KBOARD ("real-last-command", Vreal_last_command,
|
||||
doc: /* Same as `last-command', but never altered by Lisp code. */);
|
||||
|
|
@ -11455,7 +11458,10 @@ buffer's local map, and the minor mode keymaps and text property keymaps.
|
|||
It also replaces `overriding-local-map'.
|
||||
|
||||
This variable is intended to let commands such as `universal-argument'
|
||||
set up a different keymap for reading the next command. */);
|
||||
set up a different keymap for reading the next command.
|
||||
|
||||
`overriding-terminal-local-map' has a separate binding for each display device.
|
||||
See Info node `(elisp)Multiple displays'. */);
|
||||
|
||||
DEFVAR_LISP ("overriding-local-map", &Voverriding_local_map,
|
||||
doc: /* Keymap that overrides all other local keymaps.
|
||||
|
|
@ -11480,7 +11486,15 @@ and the minor mode maps regardless of `overriding-local-map'. */);
|
|||
doc: /* Alist of system-specific X windows key symbols.
|
||||
Each element should have the form (N . SYMBOL) where N is the
|
||||
numeric keysym code (sans the \"system-specific\" bit 1<<28)
|
||||
and SYMBOL is its name. */);
|
||||
and SYMBOL is its name.
|
||||
|
||||
`system-key-alist' has a separate binding for each display device.
|
||||
See Info node `(elisp)Multiple displays'.
|
||||
|
||||
Note that the currently selected frame has very little to do with
|
||||
which binding of this variable is active at any given moment. If you
|
||||
need set or get the binding on a specific display, use
|
||||
`terminal-local-value' and `set-terminal-local-value'. */);
|
||||
|
||||
DEFVAR_KBOARD ("function-key-map", Vfunction_key_map,
|
||||
doc: /* Keymap mapping ASCII function key sequences onto their preferred forms.
|
||||
|
|
@ -11503,7 +11517,12 @@ Typing `ESC O P' to `read-key-sequence' would return [f1]. Typing
|
|||
key, typing `ESC O P x' would return [f1 x].
|
||||
|
||||
`function-key-map' has a separate binding for each display device.
|
||||
See Info node `(elisp)Multiple displays'. */);
|
||||
See Info node `(elisp)Multiple displays'.
|
||||
|
||||
Note that the currently selected frame has very little to do with
|
||||
which binding of this variable is active at any given moment. If you
|
||||
need set or get the binding on a specific display, use
|
||||
`terminal-local-value' and `set-terminal-local-value'. */);
|
||||
|
||||
DEFVAR_KBOARD ("key-translation-map", Vkey_translation_map,
|
||||
doc: /* Keymap of key translations that can override keymaps.
|
||||
|
|
@ -11512,7 +11531,12 @@ and its non-prefix bindings override ordinary bindings.
|
|||
|
||||
`key-translation-map' has a separate binding for each display device.
|
||||
(See Info node `(elisp)Multiple displays'.) If you need to set a key
|
||||
translation on all devices, change `global-key-translation-map' instead. */);
|
||||
translation on all devices, change `global-key-translation-map' instead.
|
||||
|
||||
Note that the currently selected frame has very little to do with
|
||||
which binding of this variable is active at any given moment. If you
|
||||
need set or get the binding on a specific display, use
|
||||
`terminal-local-value' and `set-terminal-local-value'. */);
|
||||
|
||||
DEFVAR_LISP ("global-key-translation-map", &Vglobal_key_translation_map,
|
||||
doc: /* The parent keymap of all terminal-local `key-translation-map' instances.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue