mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-31 04:41:23 -08:00
lib-src/emacsclient.c (main.c): Fix error message. lisp/frame.el (make-frame-on-tty): New function. lisp/server.el (server-process-filter): Notify emacsclient if there was on error during evaluation. src/cm.c: Fix remaining cases of direct Wcm references. src/dispextern.h: Updated prototypes. src/dispnew.c (Fredraw_frame): Fix set_terminal_modes call. (init_display): Remove reference to meta_key. src/frame.c (make_terminal_frame): Renamed first parameter to tty_name. Call term_init before creating the frame. (Fmake_terminal_frame): Look up the `tty' and `tty-type' frame parameters from the currently selected terminal before the global default. (Fdelete_frame): Make sure that the new selected frame is live. src/keyboard.c (meta_key): Moved to struct tty_output. (read_avail_input): Fix C syntax. Update references to meta_key. (Fsuspend_emacs): pass current tty to init_sys_modes via record_unwind_protect. (Fset_input_mode): Update references to meta_key. (Fcurrent_input_mode): Ditto. src/sysdep.c (init_sys_modes): Updated old_tty and meta_key references. Don't call set_terminal_modes, it needs termcap strings. (reset_sys_modes): Call tty_reset_terminal_modes instead of reset_terminal_modes. Updated old_tty references. src/term.c: Massive updates throuout the file. (TS_*, TN_*): Moved to struct tty_output. (RPov, delete_in_insert_mode se_is_so, costs_set, insert_mode): Ditto. (standout_mode, specified_window, tty_cursor_hidden): Ditto. (tty_set_terminal_modes, tty_reset_terminal_modes): New functions. (turn_on_insert, turn_off_insert): Added tty parameter. (turn_on_highlight, turn_off_highlight, toggle_highlight): Added tty parameter. (tty_hide_cursor, tty_show_cursor): Ditto. (background_highlight, highlight_if_desired): Ditto. (tty_capable_p): Changed first parameter to tty_output. (term_init): Make sure top_frame is initialized. Don't exit on errors if this would have been a secondary terminal. Call set_terminal_modes on the end. (delete_tty): New function. (delete_tty_1): New function. (print_all_frames): New function, marginally useful for debugging. src/termchar.h (struct tty_output): Changed old_tty to be a pointer. Removed old_tty_valid member. Added tty-specific variables from term.c. src/xfaces.c (Ftty_supports_face_attributes_p): Update for new tty_capable_p. git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-9
233 lines
6.8 KiB
Text
233 lines
6.8 KiB
Text
-*- coding: utf-8; -*-
|
|
GOAL
|
|
----
|
|
|
|
The ultimate goal of this branch is to implement support for opening
|
|
multiple, different tty devices and simultaneous X and tty frames from
|
|
a single Emacs session.
|
|
|
|
WHO IS DOING IT
|
|
---------------
|
|
|
|
I'm Károly Lőrentey. My address: lorentey@elte.hu.
|
|
|
|
Patches or suggestions are welcome!
|
|
|
|
Retrieving the latest version of the branch:
|
|
|
|
tla register-archive lorentey@elte.hu--2004 http://lorentey.web.elte.hu/arch/2004/
|
|
tla get lorentey@elte.hu--2004/emacs--multi-tty--0 <directory>
|
|
|
|
(I use tla 1.1.)
|
|
|
|
|
|
STATUS
|
|
------
|
|
|
|
Basic support is there; there are some rough edges, but it already
|
|
seems to be usable. Input is read from all terminals (NOT via
|
|
MULTIKBOARD!). At the moment, the type of the new terminals must be
|
|
the same as the initial terminal. Emacsclient has been extended to
|
|
support opening a new terminal frame.
|
|
|
|
To try it out, start up the emacs server (M-x server-start), and then
|
|
(from a shell prompt on another terminal) start emacsclient with
|
|
|
|
emacsclient -h
|
|
|
|
You'll have two fully working frames on separate terminals. If you
|
|
exit emacs, both terminals should be restored to their previous
|
|
states.
|
|
|
|
X, Mac, Windows and DOS support is broken at the moment.
|
|
|
|
Tested under GNU/Linux only.
|
|
|
|
NEWS
|
|
----
|
|
|
|
For the NEWS file:
|
|
|
|
** Support for multiple terminal devices has been added. You can
|
|
specify a terminal device (`tty' parameter) and a terminal type
|
|
(`tty-type' parameter) to `make-terminal-frame'. `tty' must be a
|
|
terminal device created by the new emacsclient, or there will be
|
|
problems with terminal input and window resizes. (The kernel
|
|
notifies processes about pending input or terminal resizes only on
|
|
the controlling terminal, so we need emacsclient to sit on the real
|
|
terminal device, create SIGIO signals upon terminal input, and
|
|
forward SIGWINCH signals to us.)
|
|
|
|
You can test for the presence of multiple terminal support by
|
|
testing for the `multi-tty' feature.
|
|
|
|
** A make-frame-on-tty function has been added to make it easier to
|
|
create frames on new terminals.
|
|
|
|
** Emacsclient has been extended to support opening a new terminal
|
|
frame.
|
|
|
|
CHANGELOG
|
|
---------
|
|
|
|
See arch logs.
|
|
|
|
|
|
DIARY OF CHANGES
|
|
----------------
|
|
|
|
(ex-TODO items with explanations.)
|
|
|
|
-- Introduce a new abstraction for terminal devices.
|
|
|
|
(Done, see struct tty_output. The abstraction is not yet
|
|
complete.)
|
|
|
|
|
|
-- Change the bootstrap procedure to initialize tty_list.
|
|
|
|
(Done, but needs review.)
|
|
|
|
|
|
-- Change make-terminal-frame to support specifying another tty.
|
|
|
|
(Done, new frame parameters: `tty' and `tty-type'.)
|
|
|
|
|
|
-- Implement support for reading from multiple terminals.
|
|
|
|
(Done, read_avail_input tries to read from each terminal, until one
|
|
succeeds. MULTIKBOARD is not used. Secondary terminals don't send
|
|
SIGIO!)
|
|
|
|
-- other-frame should cycle through the frames on the `current'
|
|
terminal only.
|
|
|
|
(Done, by trivially modifiying next_frame and prev_frame.)
|
|
|
|
-- Support different terminal sizes.
|
|
|
|
(Done, no problem.)
|
|
|
|
-- Make sure terminal resizes are handled gracefully. (Could be
|
|
problematic.)
|
|
|
|
(Done. We don't get automatic SIGWINCH for additional ttys,
|
|
though.)
|
|
|
|
-- Extend emacsclient to automatically open a new tty when it connects
|
|
to Emacs.
|
|
|
|
(Done. It's an ugly hack, needs more work.)
|
|
|
|
-- Redisplay must refresh the topmost frame on all terminals, not just
|
|
the initial terminal.
|
|
|
|
(Done, but introduced ugly redisplay problems. Ugh.)
|
|
|
|
-- Fix redisplay problems.
|
|
|
|
(Done, it turned out that the entire Wcm structure must be moved
|
|
inside tty_output. Why was it so hard for me to find this out?)
|
|
|
|
-- Provide a way for emacsclient to tell Emacs that the tty has been
|
|
resized.
|
|
|
|
(Done, simply forward the SIGWINCH signal.)
|
|
|
|
-- Each keypress should automatically select the frame corresponding
|
|
to the terminal that it was coming from. This means that Emacs
|
|
must know from which terminal the last keyboard event came from.
|
|
(Multikeyboard support may help with this.)
|
|
|
|
(Done, it was quite simple.)
|
|
|
|
-- Fix SIGIO issue with secondary terminals.
|
|
|
|
(Done, emacsclient signals Emacs after writing to the proxy pseudo
|
|
terminal. This means that multi-tty does not work with raw ttys!)
|
|
|
|
|
|
-- Make make-terminal-frame look up the `tty' and `tty-type' frame
|
|
parameters from the currently selected terminal before the global
|
|
default.
|
|
|
|
(Done.)
|
|
|
|
-- Put all cached terminal escape sequences into struct tty_output.
|
|
Currently, they are still stored in global variables, so we don't
|
|
really support multiple terminal types.
|
|
|
|
(Done.)
|
|
|
|
-- Implement sane error handling after initialization. (Currently
|
|
emacs exits if you specify a bad terminal type.) The helpful error
|
|
messages must still be provided when Emacs starts.
|
|
|
|
(Done.)
|
|
|
|
-- Implement terminal deletion, i.e., deleting local frames, closing
|
|
the tty device and restoring its previous state without exiting
|
|
Emacs.
|
|
|
|
(Done, but at the moment only called when an error happens during
|
|
initialization. There is a memory corruption error around this
|
|
somewhere.)
|
|
|
|
|
|
THINGS TO DO
|
|
------------
|
|
|
|
** Fix mysterious memory corruption error with tty deletion. To
|
|
trigger it, try the following shell command:
|
|
|
|
while true; do TERM=no-such-terminal-definition emacsclient -h; done
|
|
|
|
Emacs usually dumps core after a few dozen iterations. (The bug
|
|
seems to be related to the xfree()ing or bzero()ing of
|
|
tty_output.Wcm. Maybe there are outside references to struct Wcm?
|
|
Sounds logical, otherwise these vars would not have been collected
|
|
into a struct. But where?)
|
|
|
|
This does not seem to happen if the error occurs before terminal
|
|
initialization or if I comment out all xfree()s in delete_frame.
|
|
Update: yes it does, although it is much rarer.
|
|
|
|
** C-g should work on secondary terminals.
|
|
|
|
** Move optimalization parameters (costs) from union output_data to
|
|
a backend-neutral per-device structure.
|
|
|
|
** Implement automatic deletion of terminals when the last frame on
|
|
that terminal is closed.
|
|
|
|
** Make parts of struct tty_output accessible from Lisp. The device
|
|
name and the type is sufficient.
|
|
|
|
** Export delete_tty to the Lisp environment.
|
|
|
|
** 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.
|
|
|
|
** Support raw secondary terminals. (This one is tricky, SIGIO works
|
|
only on the controlling terminal.)
|
|
|
|
** What does interrupt_input do? I tried to disable it for raw
|
|
secondary tty support, but it seems not to do anything useful.
|
|
|
|
** Fix X support.
|
|
|
|
** Do tty output through term_hooks, too.
|
|
|
|
** Allow simultaneous X and tty frames.
|
|
|
|
** 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).
|
|
|
|
|
|
|
|
;;; arch-tag: 8da1619e-2e79-41a8-9ac9-a0485daad17d
|