MULTI_KBOARD support for ttys. Input-related bugfixes for X+tty sessions.
lib-src/emacsclient.c (pty_conversation): Fix errno check for read from fileno(in). src/config.in: Unconditionally define MULTI_KBOARD. src/frame.c (make_terminal_frame): Initialize f->kboard. src/keyboard.c (cmd_error_internal): Don't kill Emacs if a Quit was pressed on the tty of a X+tty session. (read_avail_input): Initialize nread to zero. Abort if there is no tty after a termcap read. (interrupt_signal)[USG]: Always reset signal handler. (init_keyboard): Always set signal handler for SIGINT/SIGQUIT if noninteractive. src/term.c (term_dummy_init): Initialize kboard to the initial_kboard. (term_init): Free component structures of the initial tty. Clear xmalloced structures. Moved rif initialization to syms_of_term. (term_init)[MULTI_KBOARD]: Initialize tty->kboard. (delete_tty)[MULTI_KBOARD]: Delete the keyboard. (syms_of_term): Initialize tty_display_method_template. src/termchar.h (tty_output)[MULTI_KBOARD]: Added kboard member. git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-31
This commit is contained in:
parent
daf0170133
commit
7b00d185eb
10 changed files with 212 additions and 119 deletions
223
README.multi-tty
223
README.multi-tty
|
@ -6,6 +6,22 @@ The ultimate goal of this branch is to implement support for opening
|
||||||
multiple, different tty devices and simultaneous X and tty frames from
|
multiple, different tty devices and simultaneous X and tty frames from
|
||||||
a single Emacs session.
|
a single Emacs session.
|
||||||
|
|
||||||
|
Some use cases:
|
||||||
|
|
||||||
|
Emacs is notoriously slow at startup, so most people use another
|
||||||
|
editor or emacsclient for quick editing jobs from the console.
|
||||||
|
Unfortunately, emacsclient was very awkward to use, because it did not
|
||||||
|
support opening a new Emacs frame on the current virtual console.
|
||||||
|
Now, with multi-tty support, it can do that. (Emacsclient starts up
|
||||||
|
faster than vi!)
|
||||||
|
|
||||||
|
Some Gnus users (including me) run Gnus in an X frame in its own Emacs
|
||||||
|
instance, which they typically leave running for weeks. It would be
|
||||||
|
nice if they could connect to this instance from a remote ssh session
|
||||||
|
and check their messages without opening a remote X frame or resorting
|
||||||
|
to gnus-slave.
|
||||||
|
|
||||||
|
|
||||||
WHO IS DOING IT
|
WHO IS DOING IT
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
@ -18,46 +34,66 @@ Retrieving the latest version of the branch:
|
||||||
tla register-archive lorentey@elte.hu--2004 http://lorentey.web.elte.hu/arch/2004/
|
tla register-archive lorentey@elte.hu--2004 http://lorentey.web.elte.hu/arch/2004/
|
||||||
tla get lorentey@elte.hu--2004/emacs--multi-tty <directory>
|
tla get lorentey@elte.hu--2004/emacs--multi-tty <directory>
|
||||||
|
|
||||||
(I use tla 1.1.)
|
(I use a recent arch development snapshot, but any of the released
|
||||||
|
versions of arch will do fine, I think.)
|
||||||
|
|
||||||
|
If you don't have arch, the branch has a homepage from which you can
|
||||||
|
download conventional patches against Emacs CVS HEAD:
|
||||||
|
|
||||||
|
http://lorentey.web.elte.hu/project/emacs.html
|
||||||
|
|
||||||
STATUS
|
STATUS
|
||||||
------
|
------
|
||||||
|
|
||||||
Basic multi-tty support is there; there are some rough edges, but it
|
Multi-tty support is stable, I think most of the problems were fixed.
|
||||||
already seems to be usable. Emacsclient has been extended to support
|
(It still needs testing on other architectures, though.) Please let
|
||||||
opening a new terminal frame.
|
me know if you find any bugs in it. Emacsclient has been extended to
|
||||||
|
support opening a new terminal frame.
|
||||||
|
|
||||||
To try it out, compile the multi-tty branch with the following
|
To try it out, compile and run the multi-tty branch with the following
|
||||||
commands:
|
commands:
|
||||||
|
|
||||||
mkdir +build
|
mkdir +build
|
||||||
cd +build
|
cd +build
|
||||||
../configure
|
../configure
|
||||||
make bootstrap
|
make bootstrap
|
||||||
|
src/emacs -nw
|
||||||
|
M-x server-start
|
||||||
|
|
||||||
then start up the emacs server (src/emacs -nw, M-x server-start), and
|
and then (from a shell prompt on another terminal) start emacsclient
|
||||||
then (from a shell prompt on another terminal) start emacsclient with
|
with
|
||||||
|
|
||||||
lib-src/emacsclient -f /optional/file/names...
|
lib-src/emacsclient -t /optional/file/names...
|
||||||
|
|
||||||
You'll hopefully have two fully working, independent frames on
|
You'll hopefully have two fully working, independent frames on
|
||||||
separate terminals. (This seems to be very useful, emacsclient starts
|
separate terminals. The new frame is closed automatically when you
|
||||||
up even faster than vi!) :-) You can close the newly opened frame and
|
have finished editing the specified files (C-x #), but delete-frame
|
||||||
return to the shell without exiting Emacs by pressing C-x 5 0, i.e.,
|
(C-x 5 0) also works. Of course, you can create frames on more than
|
||||||
delete-frame. Creating new frames on the same tty with C-x 5 2
|
two tty devices.
|
||||||
works exactly as before. Suspending Emacs is disabled at the moment.
|
|
||||||
If you exit emacs, all terminals should be restored to their previous
|
|
||||||
states.
|
|
||||||
|
|
||||||
X support is (I hope) working, but at the moment there are problems
|
Creating new frames on the same tty with C-x 5 2 works, and they
|
||||||
with simultaneous X and tty devices, so don't do that.
|
behave the same way as in previous Emacs versions. If you exit emacs,
|
||||||
|
all terminals should be restored to their previous states.
|
||||||
|
|
||||||
Mac, Windows and DOS support is broken, probably doesn't even
|
This is work in progress, and probably full of bugs. You should
|
||||||
compile -- this will be solved later.
|
always run emacs from gdb, so that you'll have a live instance to
|
||||||
|
debug if something goes wrong. Please send me your reports.
|
||||||
|
|
||||||
Only tested on my GNU/Linux box.
|
Problems:
|
||||||
|
|
||||||
|
* Suspending Emacs is disabled if there are multiple tty
|
||||||
|
devices. Also, there is no way to suspend emacsclient. This
|
||||||
|
will be fixed.
|
||||||
|
|
||||||
|
* X support is (I hope) working, but at the moment there are
|
||||||
|
problems with simultaneous X and tty devices, so don't do
|
||||||
|
that - start a separate Emacs with -nw and run the server
|
||||||
|
there.
|
||||||
|
|
||||||
|
* Mac, Windows and DOS support is broken, probably doesn't
|
||||||
|
even compile -- this will be solved later.
|
||||||
|
|
||||||
|
* Only tested on my GNU/Linux box.
|
||||||
|
|
||||||
NEWS
|
NEWS
|
||||||
----
|
----
|
||||||
|
@ -88,6 +124,78 @@ CHANGELOG
|
||||||
|
|
||||||
See arch logs.
|
See arch logs.
|
||||||
|
|
||||||
|
THINGS TO DO
|
||||||
|
------------
|
||||||
|
|
||||||
|
** Fix rif issue with X-tty combo sessions. IMHO the best thing to do
|
||||||
|
is to get rid of that global variable (and use the value value in
|
||||||
|
display_method, which is guaranteed to be correct).
|
||||||
|
|
||||||
|
** Fix faces on tty frames during X-tty combo sessions.
|
||||||
|
|
||||||
|
** During an X-tty combo session, a (message "Hello") from a tty frame
|
||||||
|
goes to the X frame. Fix this.
|
||||||
|
|
||||||
|
** Find out the best way to support suspending Emacs with multiple
|
||||||
|
ttys. My guess: disable it on the controlling tty, but from other
|
||||||
|
ttys pass it on to emacsclient somehow. (It is (I hope) trivial to
|
||||||
|
extend emacsclient to handle suspend/resume. A `kill -STOP' almost
|
||||||
|
works right now.)
|
||||||
|
|
||||||
|
** Move baud_rate to tty_output.
|
||||||
|
|
||||||
|
** Do tty output through term_hooks, like graphical display backends.
|
||||||
|
|
||||||
|
** Implement support for starting an interactive Emacs session without
|
||||||
|
an initial frame. (The user would connect to it and open frames
|
||||||
|
later, with emacsclient.) Not necessarily a good idea.
|
||||||
|
|
||||||
|
** Fix input from raw ttys (again).
|
||||||
|
|
||||||
|
** Fix Mac support (I can't do this myself).
|
||||||
|
|
||||||
|
** Fix W32 support (I can't do this myself).
|
||||||
|
|
||||||
|
** Fix DOS support (I can't do this myself).
|
||||||
|
|
||||||
|
** Do a grep on XXX and ?? for more issues.
|
||||||
|
|
||||||
|
** Understand Emacs's low-level input system (it seems complicated) :-)
|
||||||
|
|
||||||
|
** What does interrupt_input do? I tried to disable it for raw
|
||||||
|
secondary tty support, but it does not seem to do anything useful.
|
||||||
|
(Update: Look again. X unconditionally enables this, maybe that's
|
||||||
|
why raw terminal support is broken again. I really do need to
|
||||||
|
understand input.)
|
||||||
|
|
||||||
|
** Make sure C-g goes to the right frame. This is hard, as SIGINT
|
||||||
|
doesn't have a tty parameter. :-(
|
||||||
|
|
||||||
|
** I have seen a case when Emacs with multiple ttys fell into a loop
|
||||||
|
eating 100% of CPU time. Strace showed this loop:
|
||||||
|
|
||||||
|
getpid() = 30284
|
||||||
|
kill(30284, SIGIO) = 0
|
||||||
|
--- SIGIO (I/O possible) @ 0 (0) ---
|
||||||
|
ioctl(6, FIONREAD, [0]) = -1 EIO (Input/output error)
|
||||||
|
ioctl(5, FIONREAD, [0]) = -1 EIO (Input/output error)
|
||||||
|
ioctl(0, FIONREAD, [0]) = 0
|
||||||
|
sigreturn() = ? (mask now [])
|
||||||
|
gettimeofday({1072842297, 747760}, NULL) = 0
|
||||||
|
gettimeofday({1072842297, 747806}, NULL) = 0
|
||||||
|
select(9, [0 3 5 6], NULL, NULL, {0, 0}) = 2 (in [5 6], left {0, 0})
|
||||||
|
select(9, [0 3 5 6], NULL, NULL, {0, 0}) = 2 (in [5 6], left {0, 0})
|
||||||
|
gettimeofday({1072842297, 748245}, NULL) = 0
|
||||||
|
|
||||||
|
I have not been able to reproduce this.
|
||||||
|
|
||||||
|
** Define a output_initial value for output_method for the initial
|
||||||
|
frame that is dumped with Emacs. Checking for this frame (e.g. in
|
||||||
|
cmd_error_internal) is ugly.
|
||||||
|
|
||||||
|
** emacsclient -t from an Emacs term buffer does not work, complains
|
||||||
|
about face problems. This can even lock up Emacs (if the recursive
|
||||||
|
frame sets single_kboard).
|
||||||
|
|
||||||
DIARY OF CHANGES
|
DIARY OF CHANGES
|
||||||
----------------
|
----------------
|
||||||
|
@ -222,7 +330,7 @@ DIARY OF CHANGES
|
||||||
|
|
||||||
(Done, nothing to do. It seems that Emacs does not receive SIGHUP
|
(Done, nothing to do. It seems that Emacs does not receive SIGHUP
|
||||||
from secondary ttys, which is actually a good thing.) (Update: I
|
from secondary ttys, which is actually a good thing.) (Update: I
|
||||||
think it would be a bad idea to remove server-frames anyway.)
|
think it would be a bad idea to remove server-frames.)
|
||||||
|
|
||||||
-- Change emacsclient/server.el to support the -t argument better,
|
-- Change emacsclient/server.el to support the -t argument better,
|
||||||
i.e. automatically close the socket when the frame is closed.
|
i.e. automatically close the socket when the frame is closed.
|
||||||
|
@ -316,75 +424,10 @@ DIARY OF CHANGES
|
||||||
the point of being unusable. The rif variable causes constant
|
the point of being unusable. The rif variable causes constant
|
||||||
core dumps. Handling input is indeed tricky.)
|
core dumps. Handling input is indeed tricky.)
|
||||||
|
|
||||||
THINGS TO DO
|
-- Rewrite multi-tty input in terms of MULTI_KBOARD.
|
||||||
------------
|
|
||||||
|
|
||||||
** Fix rif issue with X-tty combo sessions. IMHO the best thing to do
|
(Done. In fact, there was no need to rewrite anything, I just
|
||||||
is to get rid of that global variable (and use the value value in
|
added a kboard member to tty_display_info, and initialized the
|
||||||
display_method, which is guaranteed to be correct).
|
frame's kboard from there.)
|
||||||
|
|
||||||
** Fix faces on tty frames during X-tty combo sessions.
|
|
||||||
|
|
||||||
** Find out the best way to support suspending Emacs with multiple
|
|
||||||
ttys. My guess: disable it on the controlling tty, but from other
|
|
||||||
ttys pass it on to emacsclient somehow. (It is (I hope) trivial to
|
|
||||||
extend emacsclient to handle suspend/resume. A `kill -STOP' almost
|
|
||||||
works right now.)
|
|
||||||
|
|
||||||
** Move baud_rate to tty_output.
|
|
||||||
|
|
||||||
** Do tty output through term_hooks, like graphical display backends.
|
|
||||||
|
|
||||||
** Implement support for starting an interactive Emacs session without
|
|
||||||
an initial frame. (The user would connect to it and open frames
|
|
||||||
later, with emacsclient.) Not necessarily a good idea.
|
|
||||||
|
|
||||||
** Fix input from raw ttys (again).
|
|
||||||
|
|
||||||
** Fix Mac support (I can't do this myself).
|
|
||||||
|
|
||||||
** Fix W32 support (I can't do this myself).
|
|
||||||
|
|
||||||
** Fix DOS support (I can't do this myself).
|
|
||||||
|
|
||||||
** Do a grep on XXX and ?? for more issues.
|
|
||||||
|
|
||||||
** Understand Emacs's low-level input system (it seems complicated)
|
|
||||||
:-) and maybe rewrite multi-tty input in terms of MULTI_KBOARD.
|
|
||||||
(Update: This backtrace from a tty-X combo session hints that this
|
|
||||||
may be necessary.)
|
|
||||||
|
|
||||||
#0 abort () at /home/lorentey/work/emacs/emacs--multi-tty/src/emacs.c:417
|
|
||||||
#1 0x081104fb in read_char (commandflag=0, nmaps=0, maps=0x0, prev_event=675499188, used_mouse_menu=0x0) at /home/lorentey/work/emacs/emacs--multi-tty/src/keyboard.c:2581
|
|
||||||
#2 0x0819f23e in read_filtered_event (no_switch_frame=1, ascii_required=0, error_nonascii=0, input_method=0) at /home/lorentey/work/emacs/emacs--multi-tty/src/lread.c:468
|
|
||||||
#3 0x0819387c in Fy_or_n_p (prompt=1759896324) at /home/lorentey/work/emacs/emacs--multi-tty/src/fns.c:3115
|
|
||||||
...
|
|
||||||
|
|
||||||
** What does interrupt_input do? I tried to disable it for raw
|
|
||||||
secondary tty support, but it does not seem to do anything useful.
|
|
||||||
(Update: Look again. X unconditionally enables this, maybe that's
|
|
||||||
why raw terminal support is broken again. I really do need to
|
|
||||||
understand input.)
|
|
||||||
|
|
||||||
** Make sure C-g goes to the right frame. This is hard, as SIGINT
|
|
||||||
doesn't have a tty parameter. :-(
|
|
||||||
|
|
||||||
** I have seen a case when Emacs with multiple ttys fell into a loop
|
|
||||||
eating 100% of CPU time. Strace showed this loop:
|
|
||||||
|
|
||||||
getpid() = 30284
|
|
||||||
kill(30284, SIGIO) = 0
|
|
||||||
--- SIGIO (I/O possible) @ 0 (0) ---
|
|
||||||
ioctl(6, FIONREAD, [0]) = -1 EIO (Input/output error)
|
|
||||||
ioctl(5, FIONREAD, [0]) = -1 EIO (Input/output error)
|
|
||||||
ioctl(0, FIONREAD, [0]) = 0
|
|
||||||
sigreturn() = ? (mask now [])
|
|
||||||
gettimeofday({1072842297, 747760}, NULL) = 0
|
|
||||||
gettimeofday({1072842297, 747806}, NULL) = 0
|
|
||||||
select(9, [0 3 5 6], NULL, NULL, {0, 0}) = 2 (in [5 6], left {0, 0})
|
|
||||||
select(9, [0 3 5 6], NULL, NULL, {0, 0}) = 2 (in [5 6], left {0, 0})
|
|
||||||
gettimeofday({1072842297, 748245}, NULL) = 0
|
|
||||||
|
|
||||||
I have not been able to reproduce this.
|
|
||||||
|
|
||||||
;;; arch-tag: 8da1619e-2e79-41a8-9ac9-a0485daad17d
|
;;; arch-tag: 8da1619e-2e79-41a8-9ac9-a0485daad17d
|
||||||
|
|
|
@ -794,7 +794,7 @@ pty_conversation (FILE *in)
|
||||||
{
|
{
|
||||||
do {
|
do {
|
||||||
res = read (fileno (in), string, BUFSIZ-1);
|
res = read (fileno (in), string, BUFSIZ-1);
|
||||||
} while (res == EINTR);
|
} while (res < 0 && errno == EINTR);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
{
|
{
|
||||||
reset_tty ();
|
reset_tty ();
|
||||||
|
|
|
@ -383,7 +383,7 @@ set print sevenbit-strings
|
||||||
|
|
||||||
show environment DISPLAY
|
show environment DISPLAY
|
||||||
show environment TERM
|
show environment TERM
|
||||||
set args -geometry 80x40+0+0
|
#set args -geometry 80x40+0+0
|
||||||
|
|
||||||
# Don't let abort actually run, as it will make
|
# Don't let abort actually run, as it will make
|
||||||
# stdio stop working and therefore the `pr' command above as well.
|
# stdio stop working and therefore the `pr' command above as well.
|
||||||
|
|
|
@ -863,6 +863,12 @@ Boston, MA 02111-1307, USA. */
|
||||||
#define HAVE_MOUSE
|
#define HAVE_MOUSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Multi-tty support relies on MULTI_KBOARD. It seems safe to turn it
|
||||||
|
on unconditionally. */
|
||||||
|
#ifndef MULTI_KBOARD
|
||||||
|
#define MULTI_KBOARD
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Define USER_FULL_NAME to return a string
|
/* Define USER_FULL_NAME to return a string
|
||||||
that is the user's full name.
|
that is the user's full name.
|
||||||
It can assume that the variable `pw'
|
It can assume that the variable `pw'
|
||||||
|
|
|
@ -488,6 +488,7 @@ make_terminal_frame (tty_name, tty_type)
|
||||||
char name[20];
|
char name[20];
|
||||||
|
|
||||||
#ifdef MULTI_KBOARD
|
#ifdef MULTI_KBOARD
|
||||||
|
/* Create the initial keyboard. */
|
||||||
if (!initial_kboard)
|
if (!initial_kboard)
|
||||||
{
|
{
|
||||||
initial_kboard = (KBOARD *) xmalloc (sizeof (KBOARD));
|
initial_kboard = (KBOARD *) xmalloc (sizeof (KBOARD));
|
||||||
|
@ -567,6 +568,9 @@ make_terminal_frame (tty_name, tty_type)
|
||||||
}
|
}
|
||||||
FRAME_TTY (f)->reference_count++;
|
FRAME_TTY (f)->reference_count++;
|
||||||
f->display_method = FRAME_TTY (f)->display_method;
|
f->display_method = FRAME_TTY (f)->display_method;
|
||||||
|
#ifdef MULTI_KBOARD
|
||||||
|
f->kboard = FRAME_TTY (f)->kboard;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CANNOT_DUMP
|
#ifdef CANNOT_DUMP
|
||||||
|
|
|
@ -292,8 +292,10 @@ struct frame
|
||||||
|
|
||||||
#ifdef MULTI_KBOARD
|
#ifdef MULTI_KBOARD
|
||||||
/* A pointer to the kboard structure associated with this frame.
|
/* A pointer to the kboard structure associated with this frame.
|
||||||
For termcap frames, this points to initial_kboard. For X frames,
|
For termcap frames, it will be the same as
|
||||||
it will be the same as display.x->display_info->kboard. */
|
output_data.tty->display_info->kboard.
|
||||||
|
For X frames, it will be the same as
|
||||||
|
output_data.x->display_info->kboard. */
|
||||||
struct kboard *kboard;
|
struct kboard *kboard;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1205,7 +1205,8 @@ cmd_error_internal (data, context)
|
||||||
running under a window system. */
|
running under a window system. */
|
||||||
|| (!NILP (Vwindow_system)
|
|| (!NILP (Vwindow_system)
|
||||||
&& !inhibit_window_system
|
&& !inhibit_window_system
|
||||||
&& FRAME_TERMCAP_P (sf))
|
&& FRAME_TERMCAP_P (sf)
|
||||||
|
&& !FRAME_TTY (sf)->type) /* XXX This is ugly. */
|
||||||
|| noninteractive)
|
|| noninteractive)
|
||||||
{
|
{
|
||||||
stream = Qexternal_debugging_output;
|
stream = Qexternal_debugging_output;
|
||||||
|
@ -6594,7 +6595,7 @@ read_avail_input (expected)
|
||||||
{
|
{
|
||||||
struct input_event buf[KBD_BUFFER_SIZE];
|
struct input_event buf[KBD_BUFFER_SIZE];
|
||||||
register int i;
|
register int i;
|
||||||
int nread;
|
int nread = 0;
|
||||||
|
|
||||||
for (i = 0; i < KBD_BUFFER_SIZE; i++)
|
for (i = 0; i < KBD_BUFFER_SIZE; i++)
|
||||||
EVENT_INIT (buf[i]);
|
EVENT_INIT (buf[i]);
|
||||||
|
@ -6738,10 +6739,13 @@ read_avail_input (expected)
|
||||||
#endif /* not MSDOS */
|
#endif /* not MSDOS */
|
||||||
#endif /* not WINDOWSNT */
|
#endif /* not WINDOWSNT */
|
||||||
|
|
||||||
|
if (!tty)
|
||||||
|
abort ();
|
||||||
|
|
||||||
/* Select frame corresponding to the active tty. Note that the
|
/* Select frame corresponding to the active tty. Note that the
|
||||||
value of selected_frame is not reliable here, redisplay tends
|
value of selected_frame is not reliable here, redisplay tends
|
||||||
to temporarily change it. But tty should always be non-NULL. */
|
to temporarily change it. But tty should always be non-NULL. */
|
||||||
frame = (tty ? tty->top_frame : selected_frame);
|
frame = tty->top_frame;
|
||||||
|
|
||||||
for (i = 0; i < nread; i++)
|
for (i = 0; i < nread; i++)
|
||||||
{
|
{
|
||||||
|
@ -10245,13 +10249,10 @@ interrupt_signal (signalnum) /* If we don't have an argument, */
|
||||||
struct frame *sf = SELECTED_FRAME ();
|
struct frame *sf = SELECTED_FRAME ();
|
||||||
|
|
||||||
#if defined (USG) && !defined (POSIX_SIGNALS)
|
#if defined (USG) && !defined (POSIX_SIGNALS)
|
||||||
if (!read_socket_hook && NILP (Vwindow_system))
|
/* USG systems forget handlers when they are used;
|
||||||
{
|
must reestablish each time */
|
||||||
/* USG systems forget handlers when they are used;
|
signal (SIGINT, interrupt_signal);
|
||||||
must reestablish each time */
|
signal (SIGQUIT, interrupt_signal);
|
||||||
signal (SIGINT, interrupt_signal);
|
|
||||||
signal (SIGQUIT, interrupt_signal);
|
|
||||||
}
|
|
||||||
#endif /* USG */
|
#endif /* USG */
|
||||||
|
|
||||||
cancel_echoing ();
|
cancel_echoing ();
|
||||||
|
@ -10626,7 +10627,7 @@ init_keyboard ()
|
||||||
wipe_kboard (current_kboard);
|
wipe_kboard (current_kboard);
|
||||||
init_kboard (current_kboard);
|
init_kboard (current_kboard);
|
||||||
|
|
||||||
if (!noninteractive && !read_socket_hook && NILP (Vwindow_system))
|
if (!noninteractive)
|
||||||
{
|
{
|
||||||
signal (SIGINT, interrupt_signal);
|
signal (SIGINT, interrupt_signal);
|
||||||
#if defined (HAVE_TERMIO) || defined (HAVE_TERMIOS)
|
#if defined (HAVE_TERMIO) || defined (HAVE_TERMIOS)
|
||||||
|
|
|
@ -21,7 +21,7 @@ Boston, MA 02111-1307, USA. */
|
||||||
/* Length of echobuf field in each KBOARD. */
|
/* Length of echobuf field in each KBOARD. */
|
||||||
|
|
||||||
/* Each KBOARD represents one logical input stream from which Emacs gets input.
|
/* Each KBOARD represents one logical input stream from which Emacs gets input.
|
||||||
If we are using an ordinary terminal, it has one KBOARD object.
|
If we are using ordinary terminals, it has one KBOARD object for each terminal device.
|
||||||
Usually each X display screen has its own KBOARD,
|
Usually each X display screen has its own KBOARD,
|
||||||
but when two of them are on the same X server,
|
but when two of them are on the same X server,
|
||||||
we assume they share a keyboard and give them one KBOARD in common.
|
we assume they share a keyboard and give them one KBOARD in common.
|
||||||
|
@ -152,7 +152,7 @@ struct kboard
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef MULTI_KBOARD
|
#ifdef MULTI_KBOARD
|
||||||
/* Temporarily used before a frame has been opened, and for termcap frames */
|
/* Temporarily used before a frame has been opened. */
|
||||||
extern KBOARD *initial_kboard;
|
extern KBOARD *initial_kboard;
|
||||||
|
|
||||||
/* In the single-kboard state, this is the kboard
|
/* In the single-kboard state, this is the kboard
|
||||||
|
|
56
src/term.c
56
src/term.c
|
@ -2189,6 +2189,7 @@ term_dummy_init (void)
|
||||||
tty_list->output = stdout;
|
tty_list->output = stdout;
|
||||||
tty_list->Wcm = (struct cm *) xmalloc (sizeof (struct cm));
|
tty_list->Wcm = (struct cm *) xmalloc (sizeof (struct cm));
|
||||||
tty_list->display_method = (struct display_method *) xmalloc (sizeof (struct display_method));
|
tty_list->display_method = (struct display_method *) xmalloc (sizeof (struct display_method));
|
||||||
|
tty_list->kboard = initial_kboard;
|
||||||
return tty_list;
|
return tty_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2212,6 +2213,15 @@ term_init (Lisp_Object frame, char *name, char *terminal_type)
|
||||||
the dummy terminal created for the initial frame. */
|
the dummy terminal created for the initial frame. */
|
||||||
if (tty->type)
|
if (tty->type)
|
||||||
return tty;
|
return tty;
|
||||||
|
|
||||||
|
/* Free up temporary structures. */
|
||||||
|
if (tty->Wcm)
|
||||||
|
xfree (tty->Wcm);
|
||||||
|
if (tty->display_method)
|
||||||
|
xfree (tty->display_method);
|
||||||
|
if (tty->kboard != initial_kboard)
|
||||||
|
abort ();
|
||||||
|
tty->kboard = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2221,20 +2231,18 @@ term_init (Lisp_Object frame, char *name, char *terminal_type)
|
||||||
tty_list = tty;
|
tty_list = tty;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! tty->Wcm)
|
tty->Wcm = (struct cm *) xmalloc (sizeof (struct cm));
|
||||||
tty->Wcm = (struct cm *) xmalloc (sizeof (struct cm));
|
Wcm_clear (tty);
|
||||||
|
|
||||||
if (! tty->display_method)
|
/* Each termcap frame has its own display method. */
|
||||||
tty->display_method = (struct display_method *) xmalloc (sizeof (struct display_method));
|
tty->display_method = (struct display_method *) xmalloc (sizeof (struct display_method));
|
||||||
|
bzero (tty->display_method, sizeof (struct display_method));
|
||||||
|
|
||||||
/* Initialize the common members in the new display method with our
|
/* Initialize the common members in the new display method with our
|
||||||
predefined template. */
|
predefined template. */
|
||||||
*tty->display_method = tty_display_method_template;
|
*tty->display_method = tty_display_method_template;
|
||||||
f->display_method = tty->display_method;
|
f->display_method = tty->display_method;
|
||||||
|
|
||||||
/* Termcap-based displays don't support window-based redisplay. */
|
|
||||||
f->display_method->rif = 0;
|
|
||||||
|
|
||||||
/* Make sure the frame is live; if an error happens, it must be
|
/* Make sure the frame is live; if an error happens, it must be
|
||||||
deleted. */
|
deleted. */
|
||||||
f->output_method = output_termcap;
|
f->output_method = output_termcap;
|
||||||
|
@ -2278,7 +2286,7 @@ term_init (Lisp_Object frame, char *name, char *terminal_type)
|
||||||
FrameCols (tty) = FRAME_COLS (f);
|
FrameCols (tty) = FRAME_COLS (f);
|
||||||
tty->specified_window = FRAME_LINES (f);
|
tty->specified_window = FRAME_LINES (f);
|
||||||
|
|
||||||
f->display_method->delete_in_insert_mode = 1;
|
tty->display_method->delete_in_insert_mode = 1;
|
||||||
|
|
||||||
UseTabs (tty) = 0;
|
UseTabs (tty) = 0;
|
||||||
FRAME_SCROLL_REGION_OK (f) = 0;
|
FRAME_SCROLL_REGION_OK (f) = 0;
|
||||||
|
@ -2509,7 +2517,7 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 /* This is not used anywhere. */
|
#if 0 /* This is not used anywhere. */
|
||||||
f->display_method->min_padding_speed = tgetnum ("pb");
|
tty->display_method->min_padding_speed = tgetnum ("pb");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TabWidth (tty) = tgetnum ("tw");
|
TabWidth (tty) = tgetnum ("tw");
|
||||||
|
@ -2723,6 +2731,19 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
|
||||||
FRAME_CHAR_INS_DEL_OK (f) = 0;
|
FRAME_CHAR_INS_DEL_OK (f) = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef MULTI_KBOARD
|
||||||
|
tty->kboard = (KBOARD *) xmalloc (sizeof (KBOARD));
|
||||||
|
init_kboard (tty->kboard);
|
||||||
|
tty->kboard->next_kboard = all_kboards;
|
||||||
|
all_kboards = tty->kboard;
|
||||||
|
/* Don't let the initial kboard remain current longer than necessary.
|
||||||
|
That would cause problems if a file loaded on startup tries to
|
||||||
|
prompt in the mini-buffer. */
|
||||||
|
if (current_kboard == initial_kboard)
|
||||||
|
current_kboard = tty->kboard;
|
||||||
|
tty->kboard->reference_count++;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Don't do this. I think termcap may still need the buffer. */
|
/* Don't do this. I think termcap may still need the buffer. */
|
||||||
/* xfree (buffer); */
|
/* xfree (buffer); */
|
||||||
|
|
||||||
|
@ -2735,7 +2756,7 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
|
||||||
tty_set_terminal_modes (tty);
|
tty_set_terminal_modes (tty);
|
||||||
|
|
||||||
return tty;
|
return tty;
|
||||||
#endif /* WINDOWSNT */
|
#endif /* not WINDOWSNT */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* VARARGS 1 */
|
/* VARARGS 1 */
|
||||||
|
@ -2844,6 +2865,13 @@ delete_tty (struct tty_display_info *tty)
|
||||||
if (tty->display_method)
|
if (tty->display_method)
|
||||||
xfree (tty->display_method);
|
xfree (tty->display_method);
|
||||||
|
|
||||||
|
#ifdef MULTI_KBOARD
|
||||||
|
if (tty->kboard && --tty->kboard->reference_count > 0)
|
||||||
|
abort ();
|
||||||
|
if (tty->kboard)
|
||||||
|
delete_kboard (tty->kboard);
|
||||||
|
#endif
|
||||||
|
|
||||||
bzero (tty, sizeof (struct tty_display_info));
|
bzero (tty, sizeof (struct tty_display_info));
|
||||||
xfree (tty);
|
xfree (tty);
|
||||||
deleting_tty = 0;
|
deleting_tty = 0;
|
||||||
|
@ -2897,9 +2925,13 @@ The function should accept no arguments. */);
|
||||||
defsubr (&Sframe_tty_type);
|
defsubr (&Sframe_tty_type);
|
||||||
defsubr (&Sdelete_tty);
|
defsubr (&Sdelete_tty);
|
||||||
|
|
||||||
/* XXX tty_display_method_template initialization will go here. */
|
|
||||||
|
|
||||||
Fprovide (intern ("multi-tty"), Qnil);
|
Fprovide (intern ("multi-tty"), Qnil);
|
||||||
|
|
||||||
|
/* Initialize the display method template. */
|
||||||
|
|
||||||
|
/* Termcap-based displays don't support window-based redisplay. */
|
||||||
|
tty_display_method_template.rif = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -182,6 +182,11 @@ struct tty_display_info
|
||||||
/* This is a copy of struct frame's display_method value; needed for
|
/* This is a copy of struct frame's display_method value; needed for
|
||||||
freeing up memory when deleting the tty. */
|
freeing up memory when deleting the tty. */
|
||||||
struct display_method *display_method;
|
struct display_method *display_method;
|
||||||
|
|
||||||
|
#ifdef MULTI_KBOARD
|
||||||
|
/* The terminal's keyboard object. */
|
||||||
|
struct kboard *kboard;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A chain of structures for all tty devices currently in use. */
|
/* A chain of structures for all tty devices currently in use. */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue