diff src/frame.c @ 708:030fb4635335

*** empty log message ***
author Jim Blandy <jimb@redhat.com>
date Wed, 10 Jun 1992 03:53:16 +0000
parents b3549968267b
children d105ddc785b8
line wrap: on
line diff
--- a/src/frame.c	Wed Jun 10 02:47:07 1992 +0000
+++ b/src/frame.c	Wed Jun 10 03:53:16 1992 +0000
@@ -1,11 +1,11 @@
 /* Generic screen functions.
-   Copyright (C) 1989 Free Software Foundation.
+   Copyright (C) 1989, 1992 Free Software Foundation.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
@@ -194,7 +194,9 @@
   if (NILP (mini_window))
     {
       if (XTYPE (Vdefault_minibuffer_screen) != Lisp_Screen)
-	error ("default-minibuffer-screen must be set when creating minibufferless screens.");
+	error ("default-minibuffer-screen must be set when creating minibufferless screens");
+      if (! SCREEN_LIVE_P (XSCREEN (Vdefault_minibuffer_screen)))
+	error ("default-minibuffer-screen must be a live screen");
       mini_window = XSCREEN (Vdefault_minibuffer_screen)->minibuffer_window;
     }
   else
@@ -492,16 +494,22 @@
      minibuffer for any other screen?  */
   if (SCREEN_HAS_MINIBUF (XSCREEN (screen)))
     {
-      Lisp_Object screen2;
+      Lisp_Object screens;
+
+      for (screens = Vscreen_list;
+	   CONSP (screens);
+	   screens = XCONS (screens)->cdr)
+	{
+	  Lisp_Object this = XCONS (screens)->car;
 
-      for (screen2 = Vscreen_list; CONSP (2); screen2 = XCONS (screen2)->cdr)
-	if (! EQ (screen2, screen)
-	    && EQ (screen,
-		   (WINDOW_SCREEN
-		    (XWINDOW
-		     (SCREEN_MINIBUF_WINDOW
-		      (XSCREEN (screen2)))))))
-	  error ("Attempt to delete a surrogate minibuffer screen");
+	  if (! EQ (this, screen)
+	      && EQ (screen,
+		     (WINDOW_SCREEN
+		      (XWINDOW
+		       (SCREEN_MINIBUF_WINDOW
+			(XSCREEN (this)))))))
+	    error ("Attempt to delete a surrogate minibuffer screen");
+	}
     }
 
   /* Don't let the screen remain selected.  */
@@ -530,11 +538,15 @@
      another one.  */
   if (s == last_nonminibuf_screen)
     {
+      Lisp_Object screens;
+
       last_nonminibuf_screen = 0;
 
-      for (screen = Vscreen_list; CONSP (screen); screen = XCONS (screen)->cdr)
+      for (screens = Vscreen_list;
+	   CONSP (screens);
+	   screen = XCONS (screens)->cdr)
 	{
-	  s = XSCREEN (XCONS (screen)->car);
+	  s = XSCREEN (XCONS (screens)->car);
 	  if (!SCREEN_MINIBUF_ONLY_P (s))
 	    {
 	      last_nonminibuf_screen = s;
@@ -543,6 +555,46 @@
 	}
     }
 
+  /* If we've deleted Vdefault_minibuffer_screen, try to find another
+     one.  Prefer minibuffer-only screens, but also notice screens
+     with other windows.  */
+  if (EQ (screen, Vdefault_minibuffer_screen))
+    {
+      Lisp_Object screens;
+
+      /* The last screen we saw with a minibuffer, minibuffer-only or not.  */
+      Lisp_Object screen_with_minibuf = Qnil;
+
+      for (screens = Vscreen_list;
+	   CONSP (screens);
+	   screens = XCONS (screens)->cdr)
+	{
+	  Lisp_Object this = XCONS (screens)->car;
+
+	  if (XTYPE (this) != Lisp_Screen)
+	    abort ();
+	  s = XSCREEN (this);
+
+	  if (SCREEN_HAS_MINIBUF (s))
+	    {
+	      screen_with_minibuf = this;
+	      if (SCREEN_MINIBUF_ONLY_P (s))
+		break;
+	    }
+	}
+
+      /* We know that there must be some screen with a minibuffer out
+	 there.  If this were not true, all of the screens present
+	 would have to be minibufferless, which implies that at some
+	 point their minibuffer screens must have been deleted, but
+	 that is prohibited at the top; you can't delete surrogate
+	 minibuffer screens.  */
+      if (NILP (screen_with_minibuf))
+	abort ();
+
+      Vdefault_minibuffer_screen = screen_with_minibuf;
+    }
+
   return Qnil;
 }