Mercurial > emacs
diff src/sysdep.c @ 53341:d4e6a050c9b1
Bugfix festival.
lib-src/emacsclient.c (main_argc, main_argv): New variables.
(main): Initialize them.
(fail): Use them.
(window_change, copy_from_to): Don't kill if emacs_pid is zero.
(pty_conversation): Watch the command socket, too. Read emacs_pid
here. Emacs and emacsclient could deadlock if Emacs tried to do a
reset_sys_modes before sending its pid.
lisp/server.el: Automatically delete the client frame when done editing.
(server-frames): New variable.
(server-process-filter, server-sentinel, server-buffer-done): Use it.
(server-process-filter): Do a redisplay before evaluating other
parameters. (Prevents "emacsclient -h -e '(delete-frame)'" from
messing up the system.
src/dispextern.h: Update prototypes.
src/dispnew.c (window_change_signal): Do nothing if !term_initted.
(init_display): Set the frame size from the tty data after term_init.
src/emacs.c (main): Make sure things that init_sys_modes needs are
initialized before init_display (which calls init_sys_modes now).
(sort_args): Use xfree, not free.
(shut_down_emacs) [!EMACS_HAVE_TTY_PGRP]: Use reset_all_sys_modes
instead of reset_sys_modes.
src/frame.c (make_terminal_frame): Sigh. Move terminal initialization
back to the middle of frame setup. Handle errors by making sure that
the delete_tty() called from term_init() will see and delete this
frame.
(Fdelete_frame): Kill the frame before calling delete_tty(). Fix
condition for tty deletion.
src/keyboard.c (Fset_input_mode): Use reset_sys_modes on the current
terminal only.
src/lisp.h: Remove duplicate prototypes.
src/msdos.c (croak): use reset_all_sys_modes().
src/sysdeps.c (init_baud_rate): Added tty parameter, use it instead of CURTTY.
(child_setup_tty): Reset sigio on stdin, not CURTTY().
(reset_sigio): Added fd parameter, put explicit fcntl there.
(request_sigio, unrequest_sigio)[FASYNC]: Simply block/unblock the
SIGIO signal, don't touch the file params. There are multiple ttys
now, and we can't disable the SIGIO from emacsclient.
(get_tty_size)[VMS]: Use tty_out instead of CURTTY().
(reset_sys_modes): Don't call cursor_to, clear_end_of_line; call
cmgoto and tty_clear_end_of_line instead. The frame may already be
dead. Updated reset_sigio call.
src/term.c (clear_and_of_line): Separate tty-dependent stuff to
tty_clear_end_of_line() for reset_sys_modes.
(tty_clear_end_of_line): New function.
(term_init): Added frame parameter, don't use selected_frame.
Set the frame's output_data.tty value (in case there is an error
later). Set the frame size in Wcm, not in the frame. Only free the
termcap buffer if there is a termcap-related error. Call
init_sys_modes last, not first.
(deleting_tty): New variable.
(delete_tty): Use it for handling recursive calls. Free deleted tty,
except its Wcm (there is still a dangling reference somewhere).
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-19
| author | Karoly Lorentey <lorentey@elte.hu> |
|---|---|
| date | Mon, 29 Dec 2003 07:16:26 +0000 |
| parents | fe9b37bee5f7 |
| children | 21720c013048 |
line wrap: on
line diff
--- a/src/sysdep.c Sun Dec 28 22:28:52 2003 +0000 +++ b/src/sysdep.c Mon Dec 29 07:16:26 2003 +0000 @@ -184,6 +184,7 @@ #include "termopts.h" #include "dispextern.h" #include "process.h" +#include "cm.h" /* for reset_sys_modes */ #ifdef WINDOWSNT #include <direct.h> @@ -330,7 +331,7 @@ #endif /* SIGTSTP */ void -init_baud_rate () +init_baud_rate (struct tty_output *tty) { if (noninteractive) emacs_ospeed = 0; @@ -345,7 +346,7 @@ #ifdef VMS struct sensemode sg; - SYS$QIOW (0, fileno (TTY_INPUT (CURTTY())), IO$_SENSEMODE, &sg, 0, 0, + SYS$QIOW (0, fileno (TTY_INPUT (tty)), IO$_SENSEMODE, &sg, 0, 0, &sg.class, 12, 0, 0, 0, 0 ); emacs_ospeed = sg.xmit_baud; #else /* not VMS */ @@ -353,7 +354,7 @@ struct termios sg; sg.c_cflag = B9600; - tcgetattr (fileno (TTY_INPUT (CURTTY())), &sg); + tcgetattr (fileno (TTY_INPUT (tty)), &sg); emacs_ospeed = cfgetospeed (&sg); #if defined (USE_GETOBAUD) && defined (getobaud) /* m88k-motorola-sysv3 needs this (ghazi@noc.rutgers.edu) 9/1/94. */ @@ -366,16 +367,16 @@ sg.c_cflag = B9600; #ifdef HAVE_TCATTR - tcgetattr (fileno (TTY_INPUT (CURTTY())), &sg); + tcgetattr (fileno (TTY_INPUT (tty)), &sg); #else - ioctl (fileno (TTY_INPUT (CURTTY())), TCGETA, &sg); + ioctl (fileno (TTY_INPUT (tty)), TCGETA, &sg); #endif emacs_ospeed = sg.c_cflag & CBAUD; #else /* neither VMS nor TERMIOS nor TERMIO */ struct sgttyb sg; sg.sg_ospeed = B9600; - if (ioctl (fileno (TTY_INPUT (CURTTY())), TIOCGETP, &sg) < 0) + if (ioctl (fileno (TTY_INPUT (tty)), TIOCGETP, &sg) < 0) abort (); emacs_ospeed = sg.sg_ospeed; #endif /* not HAVE_TERMIO */ @@ -649,7 +650,7 @@ #ifdef BSD4_1 if (interrupt_input) - reset_sigio (); + reset_sigio (0); #endif /* BSD4_1 */ #ifdef RTU { @@ -915,6 +916,7 @@ int fd; { #ifdef FASYNC + /* XXX What if we get called with more than one fds? */ old_fcntl_flags = fcntl (fd, F_GETFL, 0) & ~FASYNC; fcntl (fd, F_SETFL, old_fcntl_flags | FASYNC); #endif @@ -922,9 +924,10 @@ } void -reset_sigio () +reset_sigio (fd) + int fd; { - unrequest_sigio (); + fcntl (fd, F_SETFL, old_fcntl_flags); } #ifdef FASYNC /* F_SETFL does not imply existence of FASYNC */ @@ -938,13 +941,13 @@ #ifdef SIGWINCH sigunblock (sigmask (SIGWINCH)); #endif - fcntl (fileno (TTY_INPUT (CURTTY())), F_SETFL, old_fcntl_flags | FASYNC); + sigunblock (sigmask (SIGIO)); interrupts_deferred = 0; } void -unrequest_sigio () +unrequest_sigio (void) { if (read_socket_hook) return; @@ -952,7 +955,7 @@ #ifdef SIGWINCH sigblock (sigmask (SIGWINCH)); #endif - fcntl (fileno (TTY_INPUT (CURTTY())), F_SETFL, old_fcntl_flags); + sigblock (sigmask (SIGIO)); interrupts_deferred = 1; } @@ -967,19 +970,21 @@ if (read_socket_hook) return; - ioctl (fileno (TTY_INPUT (CURTTY())), FIOASYNC, &on); + /* XXX CURTTY() is bogus here. */ + ioctl (fileno (TTY_INPUT (CURTTY ())), FIOASYNC, &on); interrupts_deferred = 0; } void -unrequest_sigio () +unrequest_sigio (struct tty_output *tty) { int off = 0; if (read_socket_hook) return; - ioctl (fileno (TTY_INPUT (CURTTY())), FIOASYNC, &off); + /* XXX CURTTY() is bogus here. */ + ioctl (fileno (TTY_INPUT (CURTTY ())), FIOASYNC, &off); interrupts_deferred = 1; } @@ -1000,7 +1005,7 @@ sigemptyset (&st); sigaddset (&st, SIGIO); - ioctl (fileno (TTY_INPUT (CURTTY())), FIOASYNC, &on); + ioctl (0, FIOASYNC, &on); /* XXX This fails for multiple ttys. */ interrupts_deferred = 0; sigprocmask (SIG_UNBLOCK, &st, (sigset_t *)0); } @@ -1013,7 +1018,7 @@ if (read_socket_hook) return; - ioctl (fileno (TTY_INPUT (CURTTY())), FIOASYNC, &off); + ioctl (0, FIOASYNC, &off); /* XXX This fails for multiple ttys. */ interrupts_deferred = 1; } @@ -1728,7 +1733,7 @@ struct sensemode tty; - SYS$QIOW (0, fileno (TTY_INPUT (CURTTY())), IO$_SENSEMODE, &tty, 0, 0, + SYS$QIOW (0, fileno (TTY_INPUT (tty_out)), IO$_SENSEMODE, &tty, 0, 0, &tty.class, 12, 0, 0, 0, 0); *widthp = tty.scr_wid; *heightp = tty.scr_len; @@ -1795,14 +1800,12 @@ } } -/* Prepare the terminal for exiting Emacs; move the cursor to the +/* Prepare the terminal for closing it; move the cursor to the bottom of the frame, turn off interrupt-driven I/O, etc. */ void reset_sys_modes (tty_out) struct tty_output *tty_out; { - struct frame *sf; - if (noninteractive) { fflush (stdout); @@ -1822,11 +1825,9 @@ ) return; #endif - sf = SELECTED_FRAME (); - cursor_to (FRAME_LINES (sf) - 1, 0); - clear_end_of_line (FRAME_COLS (sf)); - /* clear_end_of_line may move the cursor */ - cursor_to (FRAME_LINES (sf) - 1, 0); + cmgoto (tty_out, FrameRows (tty_out) - 1, 0); + tty_clear_end_of_line (tty_out, FrameCols (tty_out)); + cmgoto (tty_out, FrameRows (tty_out) - 1, 0); #if defined (IBMR2AIX) && defined (AIXHFT) { /* HFT devices normally use ^J as a LF/CR. We forced it to @@ -1852,7 +1853,7 @@ #ifdef F_SETOWN /* F_SETFL does not imply existence of F_SETOWN */ if (interrupt_input) { - reset_sigio (); + reset_sigio (tty_out); fcntl (fileno (TTY_INPUT (tty_out)), F_SETOWN, old_fcntl_owner); } #endif /* F_SETOWN */ @@ -1864,7 +1865,7 @@ #endif /* F_SETFL */ #ifdef BSD4_1 if (interrupt_input) - reset_sigio (); + reset_sigio (tty_out); #endif /* BSD4_1 */ if (tty_out->old_tty) @@ -2170,7 +2171,8 @@ request_sigio (); } -reset_sigio () +reset_sigio (fd) + int fd; { unrequest_sigio (); } @@ -2720,12 +2722,13 @@ } void -reset_sigio () +reset_sigio (fd) + int fd; { if (noninteractive) return; lmode = ~LINTRUP & lmode; - ioctl (0, TIOCLSET, &lmode); + ioctl (fd, TIOCLSET, &lmode); } void @@ -3173,7 +3176,7 @@ #undef abort sys_abort () { - reset_sys_modes (); + reset_all_sys_modes (); LIB$SIGNAL (SS$_DEBUG); } #endif /* abort */
