Commit 68bba4e4 authored by Karoly Lorentey's avatar Karoly Lorentey

Fix UTF-8 tty input when first frame is an X frame. Steps towards multiple tty locale support.

* lisp/international/mule-cmds.el (set-locale-environment): Ignore
  window-system; always set the keyboard coding system.


* src/termhooks.h (DISPLAY_TERMINAL_CODING, DISPLAY_KEYBOARD_CODING): New macros.

* src/coding.c (Fset_terminal_coding_system_internal, Fterminal_coding_system)
  (Fset_keyboard_coding_system_internal, Fkeyboard_coding_system): Add DISPLAY
  parameter.

* src/term.c (get_display): Add THROW parameter.
  (get_tty_display, Fdisplay_name, Fdisplay_tty_type, Fdisplay_controlling_tty_p)
  (Fdelete_display, Fdisplay_live_p): Update callers.
* src/xfns.c (check_x_display_info): Ditto.
* src/frame.c (Fmake_terminal_frame, Fframe_display): Ditto.

* src/dispextern.h (get_display): Update prototype.

* lisp/international/mule.el (set-terminal-coding-system)
  (set-keyboard-coding-system): Add DISPLAY parameter.

git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-338
parent 941d4811
......@@ -383,18 +383,19 @@ THINGS TO DO
Update: selecting a region with the mouse enables single_kboard
under X. This is very confusing.
Update: After discussions with Richard, this will be resolved by
having locked displays warn the user to wait, and introducing a
complex protocol to remotely bail out of single-kboard mode by
pressing C-g.
Update: After discussions with Richard Stallman, this will be
resolved by having locked displays warn the user to wait, and
introducing a complex protocol to remotely bail out of
single-kboard mode by pressing C-g.
Update: Warning the user is not trivial to implement, as Emacs has
only one echo area. Ideally the warning should not be displayed on
the display that is locking the others. Perhaps the high
probability of user confusion caused by single_kboard mode deserves
a special case in the display code. Alternatively, it might be
good enough to signal single_kboard mode by changing the modelines
or some other frame-local display element on the locked out displays.
only one echo area, shared by all frames. Ideally the warning
should not be displayed on the display that is locking the others.
Perhaps the high probability of user confusion caused by
single_kboard mode deserves a special case in the display code.
Alternatively, it might be good enough to signal single_kboard mode
by changing the modelines or some other frame-local display element
on the locked out displays.
** normal-erase-is-backspace-mode in simple.el needs to be updated for
multi-tty (rep. by Dan Waber).
......@@ -405,6 +406,22 @@ THINGS TO DO
** rif->flush_display_optional (NULL) calls should be replaced by a
new global function.
** Support multiple character locales.
(1) A version of `set-locale-environment' needs to be written
for setting up display-local settings on ttys. I think
calling set-display-table-and-terminal-coding-system and
set-keyboard-coding-system would be enough. The language
environment itself should remain a global setting.
(2) Have a look at Vlocale_coding_system. Seems like it would
be a tedious job to localize it, although most references
use it for interfacing with libc and are therefore OK with
the global definition.
Exceptions found so far: x-select-text and
x-cut-buffer-or-selection-value.
** Have a look at fatal_error_hook.
** Have a look at set_frame_matrix_frame.
......@@ -429,7 +446,8 @@ THINGS TO DO
** The terminal customization files in term/*.el tend to change global
parameters, which may confuse Emacs with multiple displays. Change
them to tweak only frame-local settings, if possible.
them to tweak only frame-local settings, if possible. (They tend
to call define-key to set function key sequences a lot.)
** Dan Nicolaescu suggests that -nw should be added as an alias for -t
in emacsclient. Good idea. (Alas, implementing this is not
......@@ -449,9 +467,6 @@ THINGS TO DO
terminals in xterm and konsole. The screen does flicker a bit,
but it's so quick it isn't noticable.
** Clean up the frame-local variable system. I think it's ugly and
error-prone. But maybe I just haven't yet fully understood it.
** Move baud_rate to struct display.
** Implement support for starting an interactive Emacs session without
......@@ -963,7 +978,7 @@ DIARY OF CHANGES
(Fixed. Emacs now uses the locale settings as seen by the
emacsclient process for server tty frames.)
(Update: Not really; Vlocale_coding_system is still global.)
-- Make `struct display' accessible to Lisp programs. Accessor functions:
......@@ -1022,5 +1037,9 @@ DIARY OF CHANGES
(Done. This is the new default. No complaints so far.)
-- Clean up the frame-local variable system. I think it's ugly and
error-prone. But maybe I just haven't yet fully understood it.
(Nothing to do. It doesn't seem ugly any more. It's rather clever.)
;;; arch-tag: 8da1619e-2e79-41a8-9ac9-a0485daad17d
......@@ -2470,11 +2470,14 @@ See also `locale-charset-language-names', `locale-language-names',
;; Set the `keyboard-coding-system' if appropriate (tty
;; only). At least X and MS Windows can generate
;; multilingual input.
(unless window-system
(let ((kcs (or coding-system
(car (get-language-info language-name
'coding-system)))))
(if kcs (set-keyboard-coding-system kcs))))
;; XXX This was disabled unless `window-system', but that
;; leads to buggy behaviour when a tty frame is opened
;; later. Setting the keyboard coding system has no adverse
;; effect on X, so let's do it anyway. -- Lorentey
(let ((kcs (or coding-system
(car (get-language-info language-name
'coding-system)))))
(if kcs (set-keyboard-coding-system kcs)))
(setq locale-coding-system
(car (get-language-info language-name 'coding-priority))))
......
......@@ -1199,13 +1199,17 @@ see) to CODING-SYSTEM."
This is normally set according to the selected language environment.
See also the command `set-terminal-coding-system'.")
(defun set-terminal-coding-system (coding-system)
"Set coding system of your terminal to CODING-SYSTEM.
All text output to the terminal will be encoded
(defun set-terminal-coding-system (coding-system &optional display)
"Set coding system of terminal output to CODING-SYSTEM.
All text output to DISPLAY will be encoded
with the specified coding system.
For a list of possible values of CODING-SYSTEM, use \\[list-coding-systems].
The default is determined by the selected language environment
or by the previous use of this command."
or by the previous use of this command.
DISPLAY may be a display id, a frame, or nil for the selected frame's display.
The setting has no effect on graphical displays."
(interactive
(list (let ((default (if (and (not (terminal-coding-system))
default-terminal-coding-system)
......@@ -1219,7 +1223,7 @@ or by the previous use of this command."
(setq coding-system default-terminal-coding-system))
(if coding-system
(setq default-terminal-coding-system coding-system))
(set-terminal-coding-system-internal coding-system)
(set-terminal-coding-system-internal coding-system display)
(redraw-frame (selected-frame)))
(defvar default-keyboard-coding-system nil
......@@ -1227,14 +1231,18 @@ or by the previous use of this command."
This is normally set according to the selected language environment.
See also the command `set-keyboard-coding-system'.")
(defun set-keyboard-coding-system (coding-system)
"Set coding system for keyboard input to CODING-SYSTEM.
(defun set-keyboard-coding-system (coding-system &optional display)
"Set coding system for keyboard input on DISPLAY to CODING-SYSTEM.
In addition, this command enables Encoded-kbd minor mode.
\(If CODING-SYSTEM is nil, Encoded-kbd mode is turned off -- see
`encoded-kbd-mode'.)
For a list of possible values of CODING-SYSTEM, use \\[list-coding-systems].
The default is determined by the selected language environment
or by the previous use of this command."
or by the previous use of this command.
DISPLAY may be a display id, a frame, or nil for the selected frame's display.
The setting has no effect on graphical displays."
(interactive
(list (let ((default (if (and (not (keyboard-coding-system))
default-keyboard-coding-system)
......@@ -1248,7 +1256,7 @@ or by the previous use of this command."
(setq coding-system default-keyboard-coding-system))
(if coding-system
(setq default-keyboard-coding-system coding-system))
(set-keyboard-coding-system-internal coding-system)
(set-keyboard-coding-system-internal coding-system display)
(setq keyboard-coding-system coding-system)
(encoded-kbd-mode (if coding-system 1 0)))
......
;; -*- no-byte-compile: t -*-
;; Define function key sequences for DEC terminals.
;; XXX We need to find a way to have these define-keys be display-local. -- Lorentey
;; Termcap or terminfo should set these.
;; (define-key function-key-map "\e[A" [up])
;; (define-key function-key-map "\e[B" [down])
......
......@@ -7305,12 +7305,13 @@ Return the corresponding character code in Big5. */)
}
DEFUN ("set-terminal-coding-system-internal", Fset_terminal_coding_system_internal,
Sset_terminal_coding_system_internal, 1, 1, 0,
Sset_terminal_coding_system_internal, 1, 2, 0,
doc: /* Internal use only. */)
(coding_system)
(coding_system, display)
Lisp_Object coding_system;
Lisp_Object display;
{
struct coding_system *terminal_coding = FRAME_TERMINAL_CODING (SELECTED_FRAME ());
struct coding_system *terminal_coding = DISPLAY_TERMINAL_CODING (get_display (display, 1));
CHECK_SYMBOL (coding_system);
setup_coding_system (Fcheck_coding_system (coding_system), terminal_coding);
/* We had better not send unsafe characters to terminal. */
......@@ -7343,33 +7344,39 @@ DEFUN ("set-safe-terminal-coding-system-internal", Fset_safe_terminal_coding_sys
}
DEFUN ("terminal-coding-system", Fterminal_coding_system,
Sterminal_coding_system, 0, 0, 0,
doc: /* Return coding system specified for terminal output. */)
()
Sterminal_coding_system, 0, 1, 0,
doc: /* Return coding system specified for terminal output on the given display.
DISPLAY may be a display id, a frame, or nil for the selected frame's display. */)
(display)
Lisp_Object display;
{
return FRAME_TERMINAL_CODING (SELECTED_FRAME ())->symbol;
return DISPLAY_TERMINAL_CODING (get_display (display, 1))->symbol;
}
DEFUN ("set-keyboard-coding-system-internal", Fset_keyboard_coding_system_internal,
Sset_keyboard_coding_system_internal, 1, 1, 0,
Sset_keyboard_coding_system_internal, 1, 2, 0,
doc: /* Internal use only. */)
(coding_system)
(coding_system, display)
Lisp_Object coding_system;
Lisp_Object display;
{
struct display *d = get_display (display, 1);
CHECK_SYMBOL (coding_system);
setup_coding_system (Fcheck_coding_system (coding_system),
FRAME_KEYBOARD_CODING (SELECTED_FRAME ()));
DISPLAY_KEYBOARD_CODING (d));
/* Character composition should be disabled. */
FRAME_KEYBOARD_CODING (SELECTED_FRAME ())->composing = COMPOSITION_DISABLED;
DISPLAY_KEYBOARD_CODING (d)->composing = COMPOSITION_DISABLED;
return Qnil;
}
DEFUN ("keyboard-coding-system", Fkeyboard_coding_system,
Skeyboard_coding_system, 0, 0, 0,
Skeyboard_coding_system, 0, 1, 0,
doc: /* Return coding system specified for decoding keyboard input. */)
()
(display)
Lisp_Object display;
{
return FRAME_KEYBOARD_CODING (SELECTED_FRAME ())->symbol;
return DISPLAY_KEYBOARD_CODING (get_display (display, 1))->symbol;
}
......
......@@ -2925,7 +2925,7 @@ extern int per_line_cost P_ ((char *));
extern void calculate_costs P_ ((struct frame *));
extern void set_tty_color_mode P_ ((struct frame *, Lisp_Object));
extern void tty_setup_colors P_ ((struct tty_display_info *, int));
extern struct display *get_display P_ ((Lisp_Object display));
extern struct display *get_display P_ ((Lisp_Object display, int));
extern struct display *get_named_tty_display P_ ((char *));
EXFUN (Fdisplay_tty_type, 1);
extern struct display *init_initial_display P_ ((void));
......
......@@ -698,9 +698,7 @@ affects all frames on the same terminal device. */)
{
display_device = XCDR (display_device);
CHECK_NUMBER (display_device);
d = get_display (XINT (display_device));
if (!d)
wrong_type_argument (Qdisplay_live_p, display_device);
d = get_display (XINT (display_device), 1);
}
}
......@@ -1073,7 +1071,7 @@ The display device is represented by its integer identifier. */)
CHECK_LIVE_FRAME (frame);
d = get_display (frame);
d = get_display (frame, 0);
if (!d)
return Qnil;
......
......@@ -2105,17 +2105,17 @@ set_tty_color_mode (f, val)
/* Return the display object specified by DISPLAY. DISPLAY may be a
display id, a frame, or nil for the display device of the current
frame. */
frame. If THROW is zero, return NULL for failure, otherwise throw
an error. */
struct display *
get_display (Lisp_Object display)
get_display (Lisp_Object display, int throw)
{
Lisp_Object result = NULL;
if (NILP (display))
display = selected_frame;
if (! INTEGERP (display) && ! FRAMEP (display))
return NULL;
if (INTEGERP (display))
{
struct display *d;
......@@ -2123,15 +2123,21 @@ get_display (Lisp_Object display)
for (d = display_list; d; d = d->next_display)
{
if (d->id == XINT (display))
return d;
{
result = d;
break;
}
}
return NULL;
}
else if (FRAMEP (display))
{
return FRAME_DISPLAY (XFRAME (display));
result = FRAME_DISPLAY (XFRAME (display));
}
return NULL;
if (result == NULL && throw)
wrong_type_argument (Qdisplay_live_p, display);
return result;
}
/* Return the tty display object specified by DISPLAY. */
......@@ -2139,7 +2145,7 @@ get_display (Lisp_Object display)
static struct display *
get_tty_display (Lisp_Object display)
{
struct display *d = get_display (display);
struct display *d = get_display (display, 0);
if (d && d->type == output_initial)
d = NULL;
......@@ -2194,10 +2200,7 @@ frame's display). */)
(display)
Lisp_Object display;
{
struct display *d = get_display (display);
if (!d)
wrong_type_argument (Qdisplay_live_p, display);
struct display *d = get_display (display, 1);
if (d->name)
return build_string (d->name);
......@@ -2210,10 +2213,8 @@ DEFUN ("display-tty-type", Fdisplay_tty_type, Sdisplay_tty_type, 0, 1, 0,
(display)
Lisp_Object display;
{
struct display *d = get_display (display);
struct display *d = get_display (display, 1);
if (!d)
wrong_type_argument (Qdisplay_live_p, display);
if (d->type != output_termcap)
error ("Display %d is not a termcap display", d->id);
......@@ -2228,10 +2229,7 @@ DEFUN ("display-controlling-tty-p", Fdisplay_controlling_tty_p, Sdisplay_control
(display)
Lisp_Object display;
{
struct display *d = get_display (display);
if (!d)
wrong_type_argument (Qdisplay_live_p, display);
struct display *d = get_display (display, 1);
if (d->type != output_termcap || d->display_info.tty->name)
return Qnil;
......@@ -3157,7 +3155,7 @@ but if the second argument FORCE is non-nil, you may do so. */)
{
struct display *d, *p;
d = get_display (display);
d = get_display (display, 0);
if (!d)
return Qnil;
......@@ -3193,7 +3191,7 @@ Displays are represented by their integer identifiers. */)
if (!INTEGERP (object))
return Qnil;
d = get_display (object);
d = get_display (object, 0);
if (!d)
return Qnil;
......
......@@ -550,6 +550,9 @@ extern struct display *display_list;
#define FRAME_TERMINAL_CODING(f) ((f)->display->terminal_coding)
#define FRAME_KEYBOARD_CODING(f) ((f)->display->keyboard_coding)
#define DISPLAY_TERMINAL_CODING(d) ((d)->terminal_coding)
#define DISPLAY_KEYBOARD_CODING(d) ((d)->keyboard_coding)
#define FRAME_RIF(f) ((f)->display->rif)
#define FRAME_DISPLAY(f) ((f)->display)
......
......@@ -263,10 +263,8 @@ check_x_display_info (frame)
}
else if (INTEGERP (frame))
{
struct display *d = get_display (XINT (frame));
struct display *d = get_display (XINT (frame), 1);
if (!d)
wrong_type_argument (Qdisplay_live_p, frame);
if (d->type != output_x_window)
error ("Display %d is not an X display", XINT (frame));
......
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