Mercurial > emacs
diff README.multi-tty @ 82988:f82e3a6f5ccb
A few more bugfixes and new features.
(Sigh.) I obviously need to remember to separate individual changes
to multiple commits.
src/emacsclient.c: Improved error handling.
(decode_options): Changed frame option (again) from -f to -t.
(print_help_and_exit): Ditto.
(copy_from_to): Check EINTR after write, not EAGAIN. Removed SIGIO hack.
(pty_conversation): Handle errors transmitted through the socket.
Handle pty errors by not reading from it anymore.
(main): Restore correct errno after socket_status failed. Send -tty
on -t, not -pty.
lisp/server.el (server-process-filter): Watch -tty, not -pty.
Use make-frame-on-tty instead of make-terminal-frame.
Don't set newframe to t if make-frame-on-tty failed.
Don't delete frames here. Print correct message when there are no
files to edit, but a new frame was requested.
(server-sentinel): Delete the frame after the process.
(server-handle-delete-frame): New function for delete-frame-functions.
(server-start): Add server-handle-delete-frame to delete-frame-functions.
(server-buffer-done): Don't delete frames here.
src/alloc.c (mark_ttys): Add prototype.
(Fgarbage_collect): Call mark_ttys.
src/emacs.c: (shut_down_emacs): Don't flush stdout before
reset_sys_modes().
src/process.c (add_keyboard_wait_descriptor_called_flag): Removed.
(add_keyboard_wait_descriptor): Removed stdin hack.
src/sysdep.c: Unconditionally include sysselect.h.
(old_fcntl_flags): Changed to an array.
(init_sigio, reset_sigio): Use it.
(narrow_foreground_group, widen_foreground_group): Use setpgid, not
setpgrp.
(old_fcntl_owner): Changed to an array.
(init_sys_modes, reset_sys_modes): Use it. Fix fsync() and reset_sigio() calls.
src/term.c (Qframe_tty_name, Qframe_tty_type): New variables.
(syms_of_term): Initialize them.
(Fframe_tty_name, Fframe_tty_type): New functions.
(term_init): Call add_keyboard_wait_descriptor().
(Fdelete_tty): New function.
(delete_tty): Call delete_keyboard_wait_descriptor().
(get_current_tty): Removed.
(mark_ttys): New function.
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-28
author | Karoly Lorentey <lorentey@elte.hu> |
---|---|
date | Wed, 31 Dec 2003 05:09:29 +0000 |
parents | 1682917e56b4 |
children | f3845715a5f6 |
line wrap: on
line diff
--- a/README.multi-tty Tue Dec 30 19:27:57 2003 +0000 +++ b/README.multi-tty Wed Dec 31 05:09:29 2003 +0000 @@ -45,15 +45,13 @@ separate terminals. (This seems to be very useful, emacsclient starts up even faster than vi!) :-) You can close the newly opened frame and return to the shell without exiting Emacs by pressing C-x 5 0, i.e., -delete-frame. (Note that this does not seem to work yet on the -original terminal.) Creating new frames on the same tty with C-x 5 2 +delete-frame. Creating new frames on the same tty with C-x 5 2 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, Mac, Windows and DOS support is broken, probably doesn't even -compile -- this will be solved later. Please see the attached README -for other issues, implementation notes and sub-TODO items. +compile -- this will be solved later. Only tested on my GNU/Linux box. @@ -75,6 +73,10 @@ ** 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. + ** Emacsclient has been extended to support opening a new terminal frame. @@ -108,6 +110,8 @@ succeeds. MULTIKBOARD is not used. Secondary terminals don't send SIGIO!) + (Update: They do, now.) + -- other-frame should cycle through the frames on the `current' terminal only. @@ -159,6 +163,10 @@ (Update: This is bullshit. There is a read_input_waiting function, extend that somehow.) + (Update of update: The first update was not right either, extending + read_input_waiting was not necessary. Secondary ttys do seem to + send signals on input.) + -- Make make-terminal-frame look up the `tty' and `tty-type' frame parameters from the currently selected terminal before the global default. @@ -231,56 +239,67 @@ free()ing memory. Utterly trivial matter. I love the C's memory management, it puts hair on your chest.) -THINGS TO DO ------------- +-- Support raw secondary terminals. (Note that SIGIO works only on + the controlling terminal.) Hint: extend read_input_waiting() for + multiple ttys and hopefully this will be fixed. -** Understand Emacs's low-level input system (it seems complicated) :-) - and maybe rewrite multi-tty input in terms of MULTIKBOARD. + (Done, it seems to have been working already for some time. It + seems F_SETOWN does work, after all. Not sure what made it fail + earlier, but it seems to be fixed (there were several changes + around request_sigio, maybe one of them did it). + read_input_waiting() is only used in sys_select(), don't change + it.) -** Find out why does Emacs abort when it wants to close its +-- Find out why does Emacs abort when it wants to close its controlling tty. Hint: chan_process[] array. Hey, maybe noninterrupt-IO would work, too? Update: no, there is no process for stdin/out. -** Support raw secondary terminals. (Note that SIGIO works only on - the controlling terminal.) Hint: extend read_input_waiting() for - multiple ttys and hopefully this will be fixed. + (Done. Added add/delete_keyboard_wait_descriptor to + term_init/delete_tty. The hint was right, in a way.) -** What does interrupt_input do? I tried to disable it for raw - secondary tty support, but it does not seem to do anything useful. - -** Issue with SIGIO: it needs to be disabled during redisplay. See if +-- Issue with SIGIO: it needs to be disabled during redisplay. See if fcntl() kernel behaviour could be emulated by emacsclient. -** Get rid of the accessor macros in termchar.h, or define macros for - all members. + (Done. Simply disabled the SIGIO emulation hack in emacsclient.) -** Make parts of struct tty_output accessible from Lisp. The device - name and the type is sufficient. - -** server.el: There are issues with saving files in buffers of closed +-- server.el: There are issues with saving files in buffers of closed clients. Try editing a file with emacsclient -f, and (without saving it) do a delete-frame. The frame is closed without question, and a surprising confirmation prompt appears in another frame. -** emacsclient.el, server.el: Handle eval or file open errors when + (Done. delete-frame now asks for confirmation if it still has + pending buffers, and modified buffers don't seem to be deleted.) + +-- emacsclient.el, server.el: Handle eval or file open errors when doing -f. -** Export delete_tty to the Lisp environment, for emacsclient. + (Done.) -** Make sure C-g goes to the right frame. This is hard, as SIGINT - doesn't have a tty parameter. :-( +-- Make parts of struct tty_output accessible from Lisp. The device + name and the type is sufficient. + + (Done, see frame-tty-name and frame-tty-type.) -** 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. +-- Export delete_tty to the Lisp environment, for emacsclient. + + (Done, see delete-tty.) -** Move optimalization parameters (costs) from union output_data to - a backend-neutral per-device structure. + +THINGS TO DO +------------ ** Find out the best way to support suspending Emacs with multiple - ttys. + ttys. My guess: disable it on the controlling tty, but other ttys + should 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. + +** Move device-specific parameters (like costs) commonly used by + device backends to a common, device-dependent structure. ** Do tty output through term_hooks, like graphical display backends. @@ -289,6 +308,10 @@ ** Allow simultaneous X and tty frames. (Handling input could be tricky.) +** 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 Mac support (I can't do this myself). ** Fix W32 support (I can't do this myself). @@ -297,4 +320,35 @@ ** Do a grep on XXX and ?? for more issues. +** Get rid of the accessor macros in termchar.h, or define macros for + all members. + +** Understand Emacs's low-level input system (it seems complicated) :-) + and maybe rewrite multi-tty input in terms of MULTIKBOARD. + +** What does interrupt_input do? I tried to disable it for raw + secondary tty support, but it does not seem to do anything useful. + +** 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 went ate 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