changeset 100632:389db2f016a4

* frame.c (delete_frame): New function derived from Fdelete_frame to handle Qnoelisp value for FORCE argument. Delete last frame iff FORCE equals Qnoelisp. (Bug#1450) (Fdelete_frame): Call delete_frame. Remove line from doc-string saying that FORCE non-nil doesn't run `delete-frame-functions'. * frame.h: Extern delete_frame. * window.c (window_loop): * terminal.c (delete_terminal): * xterm.c (x_connection_closed): * xfns.c (Fx_hide_tip): * w32fns.c (Fx_hide_tip): Call delete_frame instead of Fdelete_frame.
author Martin Rudalics <rudalics@gmx.at>
date Mon, 22 Dec 2008 09:40:33 +0000
parents 9edfb32d9f38
children 5395c014feb8
files src/ChangeLog src/frame.c src/frame.h src/terminal.c src/w32fns.c src/window.c src/xfns.c src/xterm.c
diffstat 8 files changed, 74 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Mon Dec 22 01:30:31 2008 +0000
+++ b/src/ChangeLog	Mon Dec 22 09:40:33 2008 +0000
@@ -1,3 +1,18 @@
+2008-12-22  Martin Rudalics  <rudalics@gmx.at>
+
+	* frame.c (delete_frame): New function derived from
+	Fdelete_frame to handle Qnoelisp value for FORCE argument.
+	Delete last frame iff FORCE equals Qnoelisp.  (Bug#1450)
+	(Fdelete_frame): Call delete_frame.  Remove line from doc-string
+	saying that FORCE non-nil doesn't run `delete-frame-functions'.
+	* frame.h: Extern delete_frame.
+	* window.c (window_loop):
+	* terminal.c (delete_terminal):
+	* xterm.c (x_connection_closed):
+	* xfns.c (Fx_hide_tip):
+	* w32fns.c (Fx_hide_tip): Call delete_frame instead of
+	Fdelete_frame.
+
 2008-12-21  Jason Rumney  <jasonr@gnu.org>
 
 	* w32uniscribe.c (uniscribe_encode_char): Return FONT_INVALID_CHAR
--- a/src/frame.c	Mon Dec 22 01:30:31 2008 +0000
+++ b/src/frame.c	Mon Dec 22 09:40:33 2008 +0000
@@ -1322,20 +1322,13 @@
 
 extern Lisp_Object Qrun_hook_with_args;
 
-DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "",
-       doc: /* Delete FRAME, permanently eliminating it from use.
-If omitted, FRAME defaults to the selected frame.
-A frame may not be deleted if its minibuffer is used by other frames.
-Normally, you may not delete a frame if all other frames are invisible,
-but if the second optional argument FORCE is non-nil, you may do so.
-
-This function runs `delete-frame-functions' before actually deleting the
-frame, unless the frame is a tooltip.
-The functions are run with one arg, the frame to be deleted.
-But FORCE inhibits this too.  */)
-/* FORCE is non-nil when handling a disconnected terminal.  */
-     (frame, force)
-     Lisp_Object frame, force;
+/* Delete FRAME.  When FORCE equals Qnoelisp, delete FRAME
+  unconditionally.  x_connection_closed and delete_terminal use
+  this.  Any other value of FORCE implements the semantics
+  described for Fdelete_frame.  */
+Lisp_Object
+delete_frame (frame, force)
+     register Lisp_Object frame, force;
 {
   struct frame *f;
   struct frame *sf = SELECTED_FRAME ();
@@ -1360,12 +1353,10 @@
   if (NILP (force) && !other_visible_frames (f))
     error ("Attempt to delete the sole visible or iconified frame");
 
-#if 0
-  /* This is a nice idea, but x_connection_closed needs to be able
+  /* x_connection_closed must have set FORCE to `noelisp' in order
      to delete the last frame, if it is gone.  */
-  if (NILP (XCDR (Vframe_list)))
+  if (NILP (XCDR (Vframe_list)) && !EQ (force, Qnoelisp))
     error ("Attempt to delete the only frame");
-#endif
 
   /* Does this frame have a minibuffer, and is it the surrogate
      minibuffer for any other frame?  */
@@ -1385,19 +1376,20 @@
 		     WINDOW_FRAME (XWINDOW
 				   (FRAME_MINIBUF_WINDOW (XFRAME (this))))))
 	    {
-	      /* If we MUST delete this frame, delete the other first.  */
-	      if (!NILP (force))
-		Fdelete_frame (this, force);
+	      /* If we MUST delete this frame, delete the other first.
+		 But do this only if FORCE equals `noelisp'.  */
+	      if (EQ (force, Qnoelisp))
+		delete_frame (this, Qnoelisp);
 	      else
 		error ("Attempt to delete a surrogate minibuffer frame");
 	    }
 	}
     }
 
-  /* Run `delete-frame-functions'
-     unless FORCE is `noelisp' or frame is a tooltip.
-     FORCE is set to `noelisp' when handling a disconnect from the terminal,
-     so we don't dare call Lisp code.  */
+  /* Run `delete-frame-functions' unless FORCE is `noelisp' or
+     frame is a tooltip.  FORCE is set to `noelisp' when handling
+     a disconnect from the terminal, so we don't dare call Lisp
+     code.  */
   if (NILP (Vrun_hooks) || !NILP (Fframe_parameter (frame, intern ("tooltip"))))
     ;
   if (EQ (force, Qnoelisp))
@@ -1641,6 +1633,24 @@
 
   return Qnil;
 }
+
+DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "",
+       doc: /* Delete FRAME, permanently eliminating it from use.
+FRAME defaults to the selected frame.
+
+A frame may not be deleted if its minibuffer is used by other frames.
+Normally, you may not delete a frame if all other frames are invisible,
+but if the second optional argument FORCE is non-nil, you may do so.
+
+This function runs `delete-frame-functions' before actually
+deleting the frame, unless the frame is a tooltip.
+The functions are run with one argument, the frame to be deleted.  */)
+     (frame, force)
+     Lisp_Object frame, force;
+{
+  return delete_frame (frame, !NILP (force) ? Qt : Qnil);
+}
+
 
 /* Return mouse position in character cell units.  */
 
--- a/src/frame.h	Mon Dec 22 01:30:31 2008 +0000
+++ b/src/frame.h	Mon Dec 22 09:40:33 2008 +0000
@@ -1115,6 +1115,7 @@
 					   Lisp_Object component,
 					   Lisp_Object subclass);
 
+extern Lisp_Object delete_frame P_ ((Lisp_Object, Lisp_Object));
 
 #endif /* HAVE_WINDOW_SYSTEM */
 
--- a/src/terminal.c	Mon Dec 22 01:30:31 2008 +0000
+++ b/src/terminal.c	Mon Dec 22 09:40:33 2008 +0000
@@ -256,7 +256,7 @@
   struct terminal **tp;
   Lisp_Object tail, frame;
 
-  /* Protect against recursive calls.  Fdelete_frame calls the
+  /* Protect against recursive calls.  delete_frame calls the
      delete_terminal_hook when we delete our last frame.  */
   if (!terminal->name)
     return;
@@ -269,8 +269,8 @@
       struct frame *f = XFRAME (frame);
       if (FRAME_LIVE_P (f) && f->terminal == terminal)
         {
-	  /* Maybe this should pass Qnoelisp rather than Qt?  */
-          Fdelete_frame (frame, Qt);
+	  /* Pass Qnoelisp rather than Qt.  */
+          delete_frame (frame, Qnoelisp);
         }
     }
 
@@ -283,7 +283,7 @@
   terminal->keyboard_coding = NULL;
   xfree (terminal->terminal_coding);
   terminal->terminal_coding = NULL;
-  
+
   if (terminal->kboard && --terminal->kboard->reference_count == 0)
     {
       delete_kboard (terminal->kboard);
@@ -315,7 +315,7 @@
       struct terminal *p = terminal_list;
       while (p && (p == t || !TERMINAL_ACTIVE_P (p)))
 	p = p->next_terminal;
-      
+
       if (!p)
 	error ("Attempt to delete the sole active display terminal");
     }
@@ -376,7 +376,7 @@
      Lisp_Object object;
 {
   struct terminal *t;
-  
+
   t = get_terminal (object, 0);
 
   if (!t)
--- a/src/w32fns.c	Mon Dec 22 01:30:31 2008 +0000
+++ b/src/w32fns.c	Mon Dec 22 09:40:33 2008 +0000
@@ -5944,7 +5944,7 @@
 
   if (FRAMEP (frame))
     {
-      Fdelete_frame (frame, Qnil);
+      delete_frame (frame, Qnil);
       deleted = Qt;
     }
 
--- a/src/window.c	Mon Dec 22 01:30:31 2008 +0000
+++ b/src/window.c	Mon Dec 22 09:40:33 2008 +0000
@@ -2273,7 +2273,7 @@
 		      windows = XCDR (windows);
 
 		    /* Now we can safely delete the frame.  */
-		    Fdelete_frame (w->frame, Qnil);
+		    delete_frame (w->frame, Qnil);
 		  }
 		else if (NILP (w->parent))
 		  {
@@ -2334,7 +2334,7 @@
 		      windows = XCDR (windows);
 
 		    /* Now we can safely delete the frame.  */
-		    Fdelete_frame (w->frame, Qnil);
+		    delete_frame (w->frame, Qnil);
 		  }
 		else if (!NILP (w->dedicated) && !NILP (w->parent))
 		  {
@@ -6909,7 +6909,7 @@
      int (* fn) P_ ((struct window *, void *));
      void *user_data;
 {
-  /* Fdelete_frame may set FRAME_ROOT_WINDOW (f) to Qnil.  */
+  /* delete_frame may set FRAME_ROOT_WINDOW (f) to Qnil.  */
   if (WINDOWP (FRAME_ROOT_WINDOW (f)))
     foreach_window_1 (XWINDOW (FRAME_ROOT_WINDOW (f)), fn, user_data);
 }
--- a/src/xfns.c	Mon Dec 22 01:30:31 2008 +0000
+++ b/src/xfns.c	Mon Dec 22 09:40:33 2008 +0000
@@ -5248,7 +5248,7 @@
 
   if (FRAMEP (frame))
     {
-      Fdelete_frame (frame, Qnil);
+      delete_frame (frame, Qnil);
       deleted = Qt;
 
 #ifdef USE_LUCID
--- a/src/xterm.c	Mon Dec 22 01:30:31 2008 +0000
+++ b/src/xterm.c	Mon Dec 22 09:40:33 2008 +0000
@@ -4017,7 +4017,7 @@
 
       if (! FRAME_X_P (XFRAME (frame)))
         continue;
-      
+
       /* Scan this frame's scroll bar list for a scroll bar with the
          right window ID.  */
       condemned = FRAME_CONDEMNED_SCROLL_BARS (XFRAME (frame));
@@ -6467,7 +6467,7 @@
  	      inev.ie.code = XFASTINT (c);
  	      goto done_keysym;
  	    }
- 
+
  	  /* Random non-modifier sorts of keysyms.  */
  	  if (((keysym >= XK_BackSpace && keysym <= XK_Escape)
                         || keysym == XK_Delete
@@ -7172,7 +7172,7 @@
       XTread_socket_fake_io_error = 0;
       x_io_error_quitter (terminal->display_info.x->display);
     }
-  
+
 #if 0 /* This loop is a noop now.  */
   /* Find the display we are supposed to read input for.
      It's the one communicating on descriptor SD.  */
@@ -7871,7 +7871,7 @@
       dpyinfo->reference_count++;
       dpyinfo->terminal->reference_count++;
     }
-  
+
   /* First delete frames whose mini-buffers are on frames
      that are on the dead display.  */
   FOR_EACH_FRAME (tail, frame)
@@ -7883,7 +7883,7 @@
 	  && FRAME_X_P (XFRAME (minibuf_frame))
 	  && ! EQ (frame, minibuf_frame)
 	  && FRAME_X_DISPLAY_INFO (XFRAME (minibuf_frame)) == dpyinfo)
-	Fdelete_frame (frame, Qnoelisp);
+	delete_frame (frame, Qnoelisp);
     }
 
   /* Now delete all remaining frames on the dead display.
@@ -7893,10 +7893,10 @@
     if (FRAME_X_P (XFRAME (frame))
 	&& FRAME_X_DISPLAY_INFO (XFRAME (frame)) == dpyinfo)
       {
-	/* Set this to t so that Fdelete_frame won't get confused
+	/* Set this to t so that delete_frame won't get confused
 	   trying to find a replacement.  */
 	FRAME_KBOARD (XFRAME (frame))->Vdefault_minibuffer_frame = Qt;
-	Fdelete_frame (frame, Qnoelisp);
+	delete_frame (frame, Qnoelisp);
       }
 
   /* We have to close the display to inform Xt that it doesn't
@@ -10170,7 +10170,7 @@
   terminal->name = (char *) xmalloc (SBYTES (display_name) + 1);
   strncpy (terminal->name, SDATA (display_name), SBYTES (display_name));
   terminal->name[SBYTES (display_name)] = 0;
-  
+
 #if 0
   XSetAfterFunction (x_current_display, x_trace_wire);
 #endif /* ! 0 */
@@ -10622,7 +10622,7 @@
   struct x_display_info *dpyinfo = terminal->display_info.x;
   int i;
 
-  /* Protect against recursive calls.  Fdelete_frame in
+  /* Protect against recursive calls.  delete_frame in
      delete_terminal calls us back when it deletes our last frame.  */
   if (!terminal->name)
     return;
@@ -10664,7 +10664,7 @@
 x_create_terminal (struct x_display_info *dpyinfo)
 {
   struct terminal *terminal;
-  
+
   terminal = create_terminal ();
 
   terminal->type = output_x_window;
@@ -10672,7 +10672,7 @@
   dpyinfo->terminal = terminal;
 
   /* kboard is initialized in x_term_init. */
-  
+
   terminal->clear_frame_hook = x_clear_frame;
   terminal->ins_del_lines_hook = x_ins_del_lines;
   terminal->delete_glyphs_hook = x_delete_glyphs;
@@ -10695,7 +10695,7 @@
 
   terminal->delete_frame_hook = x_destroy_window;
   terminal->delete_terminal_hook = x_delete_terminal;
-  
+
   terminal->rif = &x_redisplay_interface;
   terminal->scroll_region_ok = 1;    /* We'll scroll partial frames. */
   terminal->char_ins_del_ok = 1;