aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlan Mackenzie2021-04-16 19:34:00 +0000
committerAlan Mackenzie2021-04-16 19:34:00 +0000
commit610099d6419db5e74f8b2241cfd691324d8b710d (patch)
treee6227f6f60d00152568dbad809f82e095ec097c5 /src
parent629e5f8026c7007a928ff1ccc987d1d3059d2a7f (diff)
downloademacs-610099d6419db5e74f8b2241cfd691324d8b710d.tar.gz
emacs-610099d6419db5e74f8b2241cfd691324d8b710d.zip
Check minibuffer windows are live windows, rather than assuming it
This partly fixes bug #47207. * src/minibuf.c (choose_minibuf_frame, move_minibuffers_onto_frame) (read_minibuf (twice), read_minibuf_unwind): Before using a frame's ->minibuffer_window field, check it is valid with WINDOW_LIVE_P. (choose_minibuf_frame): Remove the emacs_abort for a null minibuffer.
Diffstat (limited to 'src')
-rw-r--r--src/minibuf.c38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/minibuf.c b/src/minibuf.c
index c9831fd50f4..a3c1b99bf32 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -112,13 +112,15 @@ choose_minibuf_frame (void)
112{ 112{
113 if (FRAMEP (selected_frame) 113 if (FRAMEP (selected_frame)
114 && FRAME_LIVE_P (XFRAME (selected_frame)) 114 && FRAME_LIVE_P (XFRAME (selected_frame))
115 && WINDOW_LIVE_P (XFRAME (selected_frame)->minibuffer_window)
115 && !EQ (minibuf_window, XFRAME (selected_frame)->minibuffer_window)) 116 && !EQ (minibuf_window, XFRAME (selected_frame)->minibuffer_window))
116 { 117 {
117 struct frame *sf = XFRAME (selected_frame); 118 struct frame *sf = XFRAME (selected_frame);
118 /* I don't think that any frames may validly have a null minibuffer 119 /* I don't think that any frames may validly have a null
119 window anymore. */ 120 minibuffer window anymore. (2021-04-15): Tooltip frames have
120 if (NILP (sf->minibuffer_window)) 121 a null MB. Comment out the following. */
121 emacs_abort (); 122 /* if (NILP (sf->minibuffer_window)) */
123 /* emacs_abort (); */
122 124
123 minibuf_window = sf->minibuffer_window; 125 minibuf_window = sf->minibuffer_window;
124 } 126 }
@@ -195,7 +197,9 @@ move_minibuffers_onto_frame (struct frame *of, bool for_deletion)
195 && (for_deletion || minibuf_follows_frame () || FRAME_INITIAL_P (of)))) 197 && (for_deletion || minibuf_follows_frame () || FRAME_INITIAL_P (of))))
196 return; 198 return;
197 if (FRAME_LIVE_P (f) 199 if (FRAME_LIVE_P (f)
198 && !EQ (f->minibuffer_window, of->minibuffer_window)) 200 && !EQ (f->minibuffer_window, of->minibuffer_window)
201 && WINDOW_LIVE_P (f->minibuffer_window) /* F not a tootip frame */
202 && WINDOW_LIVE_P (of->minibuffer_window))
199 { 203 {
200 zip_minibuffer_stacks (f->minibuffer_window, of->minibuffer_window); 204 zip_minibuffer_stacks (f->minibuffer_window, of->minibuffer_window);
201 if (for_deletion && XFRAME (MB_frame) != of) 205 if (for_deletion && XFRAME (MB_frame) != of)
@@ -636,6 +640,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt,
636 mini_frame = WINDOW_FRAME (XWINDOW (minibuf_window)); 640 mini_frame = WINDOW_FRAME (XWINDOW (minibuf_window));
637 641
638 if (minibuf_level > 1 642 if (minibuf_level > 1
643 && WINDOW_LIVE_P (XFRAME (MB_frame)->minibuffer_window)
639 && !EQ (XWINDOW (XFRAME (selected_frame)->minibuffer_window)->frame, 644 && !EQ (XWINDOW (XFRAME (selected_frame)->minibuffer_window)->frame,
640 MB_frame) 645 MB_frame)
641 && minibuf_moves_frame_when_opened () 646 && minibuf_moves_frame_when_opened ()
@@ -908,11 +913,13 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt,
908 unbind_to (count, Qnil); 913 unbind_to (count, Qnil);
909 914
910 /* Switch the frame back to the calling frame. */ 915 /* Switch the frame back to the calling frame. */
911 if ((!EQ (selected_frame, calling_frame) 916 if (FRAMEP (calling_frame)
912 || !EQ (XWINDOW (XFRAME (calling_frame)->minibuffer_window)->frame, 917 && FRAME_LIVE_P (XFRAME (calling_frame))
913 calling_frame)) 918 && (!EQ (selected_frame, calling_frame)
914 && FRAMEP (calling_frame) 919 || (WINDOW_LIVE_P (XFRAME (calling_frame)->minibuffer_window)
915 && FRAME_LIVE_P (XFRAME (calling_frame))) 920 && !EQ (XWINDOW (XFRAME (calling_frame)->minibuffer_window)
921 ->frame,
922 calling_frame))))
916 call2 (intern ("select-frame-set-input-focus"), calling_frame, Qnil); 923 call2 (intern ("select-frame-set-input-focus"), calling_frame, Qnil);
917 924
918 /* Add the value to the appropriate history list, if any. This is 925 /* Add the value to the appropriate history list, if any. This is
@@ -1056,10 +1063,13 @@ read_minibuf_unwind (void)
1056 { 1063 {
1057 f = XFRAME (exp_MB_frame); 1064 f = XFRAME (exp_MB_frame);
1058 window = f->minibuffer_window; 1065 window = f->minibuffer_window;
1059 w = XWINDOW (window); 1066 if (WINDOW_LIVE_P (window))
1060 if (EQ (w->frame, exp_MB_frame) 1067 {
1061 && EQ (w->contents, nth_minibuffer (minibuf_level))) 1068 w = XWINDOW (window);
1062 goto found; 1069 if (EQ (w->frame, exp_MB_frame)
1070 && EQ (w->contents, nth_minibuffer (minibuf_level)))
1071 goto found;
1072 }
1063 } 1073 }
1064 return; /* expired minibuffer not found. Maybe we should output an 1074 return; /* expired minibuffer not found. Maybe we should output an
1065 error, here. */ 1075 error, here. */