diff options
| author | Alan Mackenzie | 2021-04-16 19:34:00 +0000 |
|---|---|---|
| committer | Alan Mackenzie | 2021-04-16 19:34:00 +0000 |
| commit | 610099d6419db5e74f8b2241cfd691324d8b710d (patch) | |
| tree | e6227f6f60d00152568dbad809f82e095ec097c5 /src | |
| parent | 629e5f8026c7007a928ff1ccc987d1d3059d2a7f (diff) | |
| download | emacs-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.c | 38 |
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. */ |