diff src/frame.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 e77dcb66ec84
children 1682917e56b4
line wrap: on
line diff
--- a/src/frame.c	Sun Dec 28 22:28:52 2003 +0000
+++ b/src/frame.c	Mon Dec 29 07:16:26 2003 +0000
@@ -485,13 +485,6 @@
   register struct frame *f;
   Lisp_Object frame;
   char name[20];
-  struct tty_output *tty;
-
-  /* init_term may throw an error, so create the tty first. */
-  if (initialized)
-    tty = term_init (tty_name, tty_type);
-  else
-    tty = term_dummy_init ();
   
 #ifdef MULTI_KBOARD
   if (!initial_kboard)
@@ -550,9 +543,23 @@
 #ifdef MAC_OS8
   make_mac_terminal_frame (f);
 #else
-  f->output_method = output_termcap;
-  f->output_data.tty = tty;
-  f->output_data.tty->top_frame = frame;
+  {
+    struct tty_output *tty;
+    f->output_method = output_termcap;
+    
+    if (initialized)
+      {
+        /* Note that term_init may signal an error, but then it is its
+           responsibility to make sure this frame is deleted. */
+        f->output_data.tty = term_init (frame, tty_name, tty_type);
+      }
+    else
+      {
+        /* init_display() will reinitialize the terminal with correct values after dump. */
+        f->output_data.tty = term_dummy_init ();
+      }
+  }
+  
 #ifdef CANNOT_DUMP
   FRAME_FOREGROUND_PIXEL(f) = FACE_TTY_DEFAULT_FG_COLOR;
   FRAME_BACKGROUND_PIXEL(f) = FACE_TTY_DEFAULT_BG_COLOR;
@@ -1383,25 +1390,33 @@
 
   if (FRAME_TERMCAP_P (f))
     {
-      /* See if the terminal needs to be closed. */
       Lisp_Object tail, frame1;
       int delete = 1;
+      struct tty_output *tty = FRAME_TTY (f);
+
+      /* delete_tty will call us recursively, so better kill the
+         frame now. */
+      f->output_data.nothing = 0;
       
+      /* See if the terminal needs to be closed. */
       FOR_EACH_FRAME (tail, frame1)
         {
-          if (!FRAME_LIVE_P (XFRAME (frame1)) &&
-              FRAME_TERMCAP_P (XFRAME (frame1)) &&
-              FRAME_TTY (XFRAME (frame1)) == FRAME_TTY (f))
+          if (frame1 != frame
+              && FRAME_LIVE_P (XFRAME (frame1))
+              && FRAME_TERMCAP_P (XFRAME (frame1))
+              && FRAME_TTY (XFRAME (frame1)) == FRAME_TTY (f))
             {
               delete = 0;
               break;
             }
         }
       if (delete)
-        delete_tty (FRAME_TTY (f));
+        delete_tty (tty);
     }
-      
-  f->output_data.nothing = 0;
+  else
+    {
+      f->output_data.nothing = 0;
+    }
 
   /* If we've deleted the last_nonminibuf_frame, then try to find
      another one.  */