changeset 4227:b283670201b4

(Fdelete_frame): Allow deletion if there is some other visible (perhaps iconified) frame. Also allow deleting terminal frame if there are X frames.
author Richard M. Stallman <rms@gnu.org>
date Thu, 22 Jul 1993 09:01:22 +0000
parents 7c7e33d6386d
children f1441ca7277e
files src/frame.c
diffstat 1 files changed, 24 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/frame.c	Thu Jul 22 08:53:43 1993 +0000
+++ b/src/frame.c	Thu Jul 22 09:01:22 1993 +0000
@@ -574,7 +574,7 @@
   "Return the next frame in the frame list after FRAME.\n\
 By default, skip minibuffer-only frames.\n\
 If omitted, FRAME defaults to the selected frame.\n\
-If optional argument MINIFRAME is non-nil, include minibuffer-only frames.\n\
+If optional argument MINIFRAME is nil, exclude minibuffer-only frames.\n\
 If MINIFRAME is a window, include only frames using that window for their\n\
 minibuffer.\n\
 If MINIFRAME is non-nil and not a window, include all frames.")
@@ -615,9 +615,29 @@
   if (! FRAME_LIVE_P (f))
     return Qnil;
 
-  /* Are there any other frames besides this one?  */
-  if (f == selected_frame && EQ (next_frame (frame, Qt), frame))
-    error ("Attempt to delete the only frame");
+  /* If all other frames are invisible, refuse to delete.
+     (Exception: allow deleting the terminal frame when using X.)  */
+  if (f == selected_frame)
+    {
+      Lisp_Object frames;
+      int count = 0;
+
+      for (frames = Vframe_list;
+	   CONSP (frames);
+	   frames = XCONS (frames)->cdr)
+	{
+	  Lisp_Object this = XCONS (frames)->car;
+
+	  if (FRAME_VISIBLE_P (XFRAME (this))
+	      || FRAME_ICONIFIED_P (XFRAME (this))
+	      /* Allow deleting the terminal frame when at least
+		 one X frame exists!  */
+	      || FRAME_X_P (XFRAME (this)) && !FRAME_X_P (f))
+	    count++;
+	}
+      if (count == 1)
+	error ("Attempt to delete the only frame");
+    }
 
   /* Does this frame have a minibuffer, and is it the surrogate
      minibuffer for any other frame?  */