]> git.eshelyaron.com Git - emacs.git/commitdiff
(Fnext_window, Fprevious_window): Don't get stuck in a loop
authorRichard M. Stallman <rms@gnu.org>
Sun, 24 Jul 1994 20:02:37 +0000 (20:02 +0000)
committerRichard M. Stallman <rms@gnu.org>
Sun, 24 Jul 1994 20:02:37 +0000 (20:02 +0000)
in the minibuffer frame.

src/window.c

index 493e2889537764925a52af6b58da417fa0a40fd7..f4cfcb2b7256244f2af26154f0e784a827ce9788 100644 (file)
@@ -880,15 +880,14 @@ DEFUN ("next-window", Fnext_window, Snext_window, 0, 3, 0,
     minibuf = (minibuf_level ? Qt : Qlambda);
 
 #ifdef MULTI_FRAME
-  /* all_frames == nil doesn't specify which frames to include.
-     Decide which frames it includes.  */
+  /* all_frames == nil doesn't specify which frames to include.  */
   if (NILP (all_frames))
     all_frames = (EQ (minibuf, Qt)
-                  ? (FRAME_MINIBUF_WINDOW
-                     (XFRAME
-                      (WINDOW_FRAME
-                       (XWINDOW (window)))))
-                  : Qnil);
+                 ? (FRAME_MINIBUF_WINDOW
+                    (XFRAME
+                     (WINDOW_FRAME
+                      (XWINDOW (window)))))
+                 : Qnil);
   else if (EQ (all_frames, Qvisible))
     ;
   else if (XFASTINT (all_frames) == 0)
@@ -918,7 +917,19 @@ DEFUN ("next-window", Fnext_window, Snext_window, 0, 3, 0,
            tem = WINDOW_FRAME (XWINDOW (window));
 #ifdef MULTI_FRAME
            if (! NILP (all_frames))
-             tem = next_frame (tem, all_frames);
+             {
+               Lisp_Object tem1;
+
+               tem1 = tem;
+               tem = next_frame (tem, all_frames);
+               /* In the case where the minibuffer is active,
+                  and we include its frame as well as the selected one,
+                  next_frame may get stuck in that frame.
+                  If that happens, go back to the selected frame
+                  so we can complete the cycle.  */
+               if (EQ (tem, tem1))
+                 XSET (tem, Lisp_Frame, selected_frame);
+             }
 #endif
            tem = FRAME_ROOT_WINDOW (XFRAME (tem));
 
@@ -1050,7 +1061,19 @@ DEFUN ("previous-window", Fprevious_window, Sprevious_window, 0, 3, 0,
                 paths through the set of acceptable windows.
                 window_loop assumes that these `ring' requirement are
                 met.  */
-             tem = prev_frame (tem, all_frames);
+             {
+               Lisp_Object tem1;
+
+               tem1 = tem;
+               tem = prev_frame (tem, all_frames);
+               /* In the case where the minibuffer is active,
+                  and we include its frame as well as the selected one,
+                  next_frame may get stuck in that frame.
+                  If that happens, go back to the selected frame
+                  so we can complete the cycle.  */
+               if (EQ (tem, tem1))
+                 XSET (tem, Lisp_Frame, selected_frame);
+             }
 #endif
            /* If this frame has a minibuffer, find that window first,
               because it is conceptually the last window in that frame.  */