Commit 2a42d440 authored by Karoly Lorentey's avatar Karoly Lorentey
Browse files

Work around nondeterministic binding of terminal-local variables. (Fixes...

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
parent e589efa5
......@@ -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"
......
......@@ -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.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment