summaryrefslogtreecommitdiff
path: root/src/minibuf.c
diff options
context:
space:
mode:
authorMartin Rudalics <rudalics@gmx.at>2024-08-23 10:27:12 +0200
committerMartin Rudalics <rudalics@gmx.at>2024-08-23 10:27:12 +0200
commit25f537216682eecedf3905c4e005f02be007ed9c (patch)
tree8fc3f4511dc9e9f28f0e14328b21182a2484e100 /src/minibuf.c
parentcfcba7ddc41b84f108809bdd8d7201c181fd62ab (diff)
downloademacs-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.c39
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);
}
}