mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-28 07:45:00 +00:00
FOR_EACH_FRAME no longer assumes frame-list
This cleans up a recent fix related to Bug#29661. Suggested by Stefan Monnier in: https://lists.gnu.org/r/emacs-devel/2017-12/msg00544.html * src/frame.c (next_frame, prev_frame, delete_frame): Restore debugging checks that Vframe_list is non-nil, as FOR_EACH_FRAME no longer has these checks. (delete_frame): Remove no-longer-needed checks that Vframe_list is non-nil, as FOR_EACH_FRAME no longer assumes that. * src/frame.h (FOR_EACH_FRAME): Do not assume Vframe_list is non-nil.
This commit is contained in:
parent
d64b88da2f
commit
e019c35df6
13
src/frame.c
13
src/frame.c
@ -1607,6 +1607,8 @@ next_frame (Lisp_Object frame, Lisp_Object minibuf)
|
||||
Lisp_Object f, tail;
|
||||
int passed = 0;
|
||||
|
||||
eassume (CONSP (Vframe_list));
|
||||
|
||||
while (passed < 2)
|
||||
FOR_EACH_FRAME (tail, f)
|
||||
{
|
||||
@ -1629,6 +1631,8 @@ prev_frame (Lisp_Object frame, Lisp_Object minibuf)
|
||||
{
|
||||
Lisp_Object f, tail, prev = Qnil;
|
||||
|
||||
eassume (CONSP (Vframe_list));
|
||||
|
||||
FOR_EACH_FRAME (tail, f)
|
||||
{
|
||||
if (EQ (frame, f) && !NILP (prev))
|
||||
@ -1914,6 +1918,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
|
||||
if (f == sf)
|
||||
{
|
||||
Lisp_Object tail;
|
||||
eassume (CONSP (Vframe_list));
|
||||
|
||||
/* Look for another visible frame on the same terminal.
|
||||
Do not call next_frame here because it may loop forever.
|
||||
@ -2058,7 +2063,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
|
||||
|
||||
/* If we've deleted the last_nonminibuf_frame, then try to find
|
||||
another one. */
|
||||
if (f == last_nonminibuf_frame && !NILP (Vframe_list))
|
||||
if (f == last_nonminibuf_frame)
|
||||
{
|
||||
last_nonminibuf_frame = 0;
|
||||
|
||||
@ -2076,7 +2081,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
|
||||
|
||||
/* If there's no other frame on the same kboard, get out of
|
||||
single-kboard state if we're in it for this kboard. */
|
||||
if (kb != NULL && !NILP (Vframe_list))
|
||||
if (kb != NULL)
|
||||
{
|
||||
/* Some frame we found on the same kboard, or nil if there are none. */
|
||||
Lisp_Object frame_on_same_kboard = Qnil;
|
||||
@ -2093,9 +2098,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
|
||||
/* If we've deleted this keyboard's default_minibuffer_frame, try to
|
||||
find another one. Prefer minibuffer-only frames, but also notice
|
||||
frames with other windows. */
|
||||
if (kb != NULL
|
||||
&& EQ (frame, KVAR (kb, Vdefault_minibuffer_frame))
|
||||
&& !NILP (Vframe_list))
|
||||
if (kb != NULL && EQ (frame, KVAR (kb, Vdefault_minibuffer_frame)))
|
||||
{
|
||||
/* The last frame we saw with a minibuffer, minibuffer-only or not. */
|
||||
Lisp_Object frame_with_minibuf = Qnil;
|
||||
|
@ -1149,8 +1149,7 @@ default_pixels_per_inch_y (void)
|
||||
/* FOR_EACH_FRAME (LIST_VAR, FRAME_VAR) followed by a statement is a
|
||||
`for' loop which iterates over the elements of Vframe_list. The
|
||||
loop will set FRAME_VAR, a Lisp_Object, to each frame in
|
||||
Vframe_list in succession and execute the statement. Vframe_list
|
||||
should be nonempty, so the body is executed at least once. LIST_VAR
|
||||
Vframe_list in succession and execute the statement. LIST_VAR
|
||||
should be a Lisp_Object too; it is used to iterate through the
|
||||
Vframe_list. Note that this macro walks over child frames and
|
||||
the tooltip frame as well.
|
||||
@ -1160,7 +1159,7 @@ default_pixels_per_inch_y (void)
|
||||
something which executes the statement once. */
|
||||
|
||||
#define FOR_EACH_FRAME(list_var, frame_var) \
|
||||
for ((list_var) = (eassume (CONSP (Vframe_list)), Vframe_list); \
|
||||
for ((list_var) = Vframe_list; \
|
||||
(CONSP (list_var) \
|
||||
&& (frame_var = XCAR (list_var), true)); \
|
||||
list_var = XCDR (list_var))
|
||||
|
Loading…
Reference in New Issue
Block a user