]> git.eshelyaron.com Git - emacs.git/commitdiff
(Fdelete_frame): Allow deletion if there is some other
authorRichard M. Stallman <rms@gnu.org>
Thu, 22 Jul 1993 09:01:22 +0000 (09:01 +0000)
committerRichard M. Stallman <rms@gnu.org>
Thu, 22 Jul 1993 09:01:22 +0000 (09:01 +0000)
visible (perhaps iconified) frame.  Also allow deleting terminal frame
if there are X frames.

src/frame.c

index e706283a0b243d4bd7b05893b26f64fb4c6f4ef7..4bfa9640bde8834dced711f9930cf1494d6b9312 100644 (file)
@@ -574,7 +574,7 @@ DEFUN ("next-frame", Fnext_frame, Snext_frame, 0, 2, 0,
   "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 @@ A frame may not be deleted if its minibuffer is used by other frames.")
   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?  */