diff options
author | Martin Rudalics <rudalics@gmx.at> | 2024-08-23 10:27:12 +0200 |
---|---|---|
committer | Martin Rudalics <rudalics@gmx.at> | 2024-08-23 10:27:12 +0200 |
commit | 25f537216682eecedf3905c4e005f02be007ed9c (patch) | |
tree | 8fc3f4511dc9e9f28f0e14328b21182a2484e100 /src/minibuf.c | |
parent | cfcba7ddc41b84f108809bdd8d7201c181fd62ab (diff) | |
download | emacs-25f537216682eecedf3905c4e005f02be007ed9c.tar.gz emacs-25f537216682eecedf3905c4e005f02be007ed9c.tar.bz2 emacs-25f537216682eecedf3905c4e005f02be007ed9c.zip |
Avoid putting a dead buffer in the minibuffer window (Bug#72487)
* src/minibuf.c (minibuffer_unwind): Make sure that the buffer
referenced by the first element of the list of previous buffers
of the minibuffer window is live before assigning it to the
minibuffer window (Bug#72487).
* src/window.c (set_window_buffer): Assert that BUFFER is live.
Diffstat (limited to 'src/minibuf.c')
-rw-r--r-- | src/minibuf.c | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/src/minibuf.c b/src/minibuf.c index 1dfee0a59c9..f16880011f7 100644 --- a/src/minibuf.c +++ b/src/minibuf.c @@ -63,7 +63,7 @@ Lisp_Object last_minibuf_string; static Lisp_Object minibuf_prompt; -/* The frame containinug the most recently opened Minibuffer. This is +/* The frame containing the most recently opened minibuffer. This is used only when `minibuffer-follows-selected-frame' is neither nil nor t. */ @@ -1248,27 +1248,36 @@ static void minibuffer_unwind (void) { struct frame *f; - struct window *w; - Lisp_Object window; - Lisp_Object entry; if (NILP (exp_MB_frame)) return; /* "Can't happen." */ f = XFRAME (exp_MB_frame); - window = f->minibuffer_window; - w = XWINDOW (window); if (FRAME_LIVE_P (f)) { - /* minibuf_window = sf->minibuffer_window; */ - if (!NILP (w->prev_buffers)) + Lisp_Object window = f->minibuffer_window; + + if (WINDOW_LIVE_P (window)) { - entry = Fcar (w->prev_buffers); - w->prev_buffers = Fcdr (w->prev_buffers); - set_window_buffer (window, Fcar (entry), 0, 0); - Fset_window_start (window, Fcar (Fcdr (entry)), Qnil); - Fset_window_point (window, Fcar (Fcdr (Fcdr (entry)))); + struct window *w = XWINDOW (window); + + /* minibuf_window = sf->minibuffer_window; */ + if (!NILP (w->prev_buffers)) + { + Lisp_Object entry = Fcar (w->prev_buffers); + + if (BUFFERP (Fcar (entry)) + && BUFFER_LIVE_P (XBUFFER (Fcar (entry)))) + { + wset_prev_buffers (w, Fcdr (w->prev_buffers)); + set_window_buffer (window, Fcar (entry), 0, 0); + Fset_window_start (window, Fcar (Fcdr (entry)), Qnil); + Fset_window_point (window, Fcar (Fcdr (Fcdr (entry)))); + } + else + set_window_buffer (window, nth_minibuffer (0), 0, 0); + } + else + set_window_buffer (window, nth_minibuffer (0), 0, 0); } - else - set_window_buffer (window, nth_minibuffer (0), 0, 0); } } |