{
int part;
+#ifdef MULTI_FRAME
if (NILP (frame))
XSET (frame, Lisp_Frame, selected_frame);
else
CHECK_LIVE_FRAME (frame, 2);
+#endif
CHECK_NUMBER (row, 0);
CHECK_NUMBER (column, 1);
register Lisp_Object w;
register Lisp_Object best_window;
register Lisp_Object next_window;
- register Lisp_Object first_window;
+ register Lisp_Object last_window;
FRAME_PTR frame;
+#ifdef MULTI_FRAME
/* If we're only looping through windows on a particular frame,
frame points to that frame. If we're looping through windows
on all frames, frame is 0. */
frame = selected_frame;
else
frame = 0;
+#else
+ frame = 0;
+#endif
/* Pick a window to start with. */
if (XTYPE (obj) == Lisp_Window)
- first_window = obj;
+ w = obj;
else if (frame)
- first_window = FRAME_SELECTED_WINDOW (frame);
+ w = FRAME_SELECTED_WINDOW (frame);
else
- first_window = FRAME_SELECTED_WINDOW (selected_frame);
+ w = FRAME_SELECTED_WINDOW (selected_frame);
+
+ /* Figure out the last window we're going to mess with. Since
+ Fnext_window, given the same options, is guaranteed to go in a
+ ring, we can just use Fprevious_window to find the last one.
+
+ We can't just wait until we hit the first window again, because
+ it might be deleted. */
+
+#ifdef MULTI_FRAME
+ if (frame)
+ last_window = Fprevious_window (w, (mini ? Qt : Qnil), Qlambda);
+ else
+#endif /* MULTI_FRAME */
+ /* We know frame is 0, so we're looping through all frames.
+ Or we know this isn't a MULTI_FRAME Emacs, so who cares? */
+ last_window = Fprevious_window (w, mini ? Qt : Qnil, Qt);
- w = first_window;
best_window = Qnil;
- do
+ for (;;)
{
/* Pick the next window now, since some operations will delete
the current window. */
if (frame)
next_window = Fnext_window (w, (mini ? Qt : Qnil), Qlambda);
else
-#endif /* MULTI_FRAME */
+#endif /* MULTI_FRAME */
/* We know frame is 0, so we're looping through all frames.
Or we know this isn't a MULTI_FRAME Emacs, so who cares? */
next_window = Fnext_window (w, mini ? Qt : Qnil, Qt);
}
break;
}
+
+ if (EQ (w, last_window))
+ break;
+
w = next_window;
}
- while (! EQ (w, first_window));
return best_window;
}
#else /* not MULTI_FRAME */
extern Lisp_Object get_minibuffer ();
- FRAME_ROOT_WINDOW (selected_frame) = make_window ();
minibuf_window = make_window ();
+ FRAME_ROOT_WINDOW (selected_frame) = make_window ();
XWINDOW (FRAME_ROOT_WINDOW (selected_frame))->next = minibuf_window;
XWINDOW (minibuf_window)->prev = FRAME_ROOT_WINDOW (selected_frame);
+ XWINDOW (minibuf_window)->mini_p = Qt;
/* These values 9 and 10 are arbitrary,
just so that there is "something there."