diff options
| author | Martin Rudalics | 2024-09-11 10:36:14 +0200 |
|---|---|---|
| committer | Martin Rudalics | 2024-09-11 10:36:14 +0200 |
| commit | fc3a7f45292b9a7be95fdefd24fedb7e8f564d1c (patch) | |
| tree | 42c8f350f181c8705564f4320054c0fdaefbba77 /src | |
| parent | 74ea24233ca281b19c3e3d2552621ceac30dfc48 (diff) | |
| download | emacs-fc3a7f45292b9a7be95fdefd24fedb7e8f564d1c.tar.gz emacs-fc3a7f45292b9a7be95fdefd24fedb7e8f564d1c.zip | |
For minibuffer windows record minibuffers only (Bug#72487)
* src/minibuf.c (zip_minibuffer_stacks): Use wset type
functions. Call 'record-window-buffer' instead of
'push-window-buffer-onto-prev' to handle all sorts of buffers
shown in minibuffer windows in a uniform way.
(read_minibuf): Call 'record-window-buffer' instead of
'push-window-buffer-onto-prev' for same reason as previous.
* lisp/calculator.el (calculator-update-display)
(calculator-save-and-quit): Make sure calculator buffer is live
before operating on it.
* lisp/window.el (record-window-buffer): Handle case where
WINDOW is a minibuffer window: Unconditionally remove WINDOW's
buffer from WINDOW's list of previous buffers and push it if
and only if it is a live minibuffer (Bug#72487). Do not run
'buffer-list-update-hook' if WINDOW is a minibuffer window.
(push-window-buffer-onto-prev): Make it an alias of
'record-window-buffer' so it will run the latter's checks.
(replace-buffer-in-windows): Handle minibuffer windows and
rewrite doc-string accordingly.
* doc/lispref/windows.texi (Buffers and Windows): Explain
handling of minibuffer windows in 'replace-buffer-in-windows'.
Diffstat (limited to 'src')
| -rw-r--r-- | src/minibuf.c | 20 | ||||
| -rw-r--r-- | src/window.c | 14 |
2 files changed, 21 insertions, 13 deletions
diff --git a/src/minibuf.c b/src/minibuf.c index f16880011f7..1f94e0e650e 100644 --- a/src/minibuf.c +++ b/src/minibuf.c | |||
| @@ -160,16 +160,15 @@ zip_minibuffer_stacks (Lisp_Object dest_window, Lisp_Object source_window) | |||
| 160 | set_window_buffer (dest_window, sw->contents, 0, 0); | 160 | set_window_buffer (dest_window, sw->contents, 0, 0); |
| 161 | Fset_window_start (dest_window, Fwindow_start (source_window), Qnil); | 161 | Fset_window_start (dest_window, Fwindow_start (source_window), Qnil); |
| 162 | Fset_window_point (dest_window, Fwindow_point (source_window)); | 162 | Fset_window_point (dest_window, Fwindow_point (source_window)); |
| 163 | dw->prev_buffers = sw->prev_buffers; | 163 | wset_prev_buffers (dw, sw->prev_buffers); |
| 164 | set_window_buffer (source_window, nth_minibuffer (0), 0, 0); | 164 | set_window_buffer (source_window, nth_minibuffer (0), 0, 0); |
| 165 | sw->prev_buffers = Qnil; | 165 | wset_prev_buffers (sw, Qnil); |
| 166 | return; | 166 | return; |
| 167 | } | 167 | } |
| 168 | 168 | ||
| 169 | if (live_minibuffer_p (dw->contents)) | 169 | call1 (Qrecord_window_buffer, dest_window); |
| 170 | call1 (Qpush_window_buffer_onto_prev, dest_window); | 170 | call1 (Qrecord_window_buffer, source_window); |
| 171 | if (live_minibuffer_p (sw->contents)) | 171 | |
| 172 | call1 (Qpush_window_buffer_onto_prev, source_window); | ||
| 173 | acc = merge_c (dw->prev_buffers, sw->prev_buffers, minibuffer_ent_greater); | 172 | acc = merge_c (dw->prev_buffers, sw->prev_buffers, minibuffer_ent_greater); |
| 174 | 173 | ||
| 175 | if (!NILP (acc)) | 174 | if (!NILP (acc)) |
| @@ -180,8 +179,9 @@ zip_minibuffer_stacks (Lisp_Object dest_window, Lisp_Object source_window) | |||
| 180 | Fset_window_start (dest_window, Fcar (Fcdr (d_ent)), Qnil); | 179 | Fset_window_start (dest_window, Fcar (Fcdr (d_ent)), Qnil); |
| 181 | Fset_window_point (dest_window, Fcar (Fcdr (Fcdr (d_ent)))); | 180 | Fset_window_point (dest_window, Fcar (Fcdr (Fcdr (d_ent)))); |
| 182 | } | 181 | } |
| 183 | dw->prev_buffers = acc; | 182 | |
| 184 | sw->prev_buffers = Qnil; | 183 | wset_prev_buffers (dw, acc); |
| 184 | wset_prev_buffers (sw, Qnil); | ||
| 185 | set_window_buffer (source_window, nth_minibuffer (0), 0, 0); | 185 | set_window_buffer (source_window, nth_minibuffer (0), 0, 0); |
| 186 | } | 186 | } |
| 187 | 187 | ||
| @@ -688,8 +688,8 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, | |||
| 688 | Fframe_first_window (MB_frame), Qnil); | 688 | Fframe_first_window (MB_frame), Qnil); |
| 689 | } | 689 | } |
| 690 | MB_frame = XWINDOW (XFRAME (selected_frame)->minibuffer_window)->frame; | 690 | MB_frame = XWINDOW (XFRAME (selected_frame)->minibuffer_window)->frame; |
| 691 | if (live_minibuffer_p (XWINDOW (minibuf_window)->contents)) | 691 | |
| 692 | call1 (Qpush_window_buffer_onto_prev, minibuf_window); | 692 | call1 (Qrecord_window_buffer, minibuf_window); |
| 693 | 693 | ||
| 694 | record_unwind_protect_void (minibuffer_unwind); | 694 | record_unwind_protect_void (minibuffer_unwind); |
| 695 | if (read_minibuffer_restore_windows) | 695 | if (read_minibuffer_restore_windows) |
diff --git a/src/window.c b/src/window.c index 35092ddd582..34968ac824f 100644 --- a/src/window.c +++ b/src/window.c | |||
| @@ -3647,9 +3647,17 @@ replace_buffer_in_windows (Lisp_Object buffer) | |||
| 3647 | call1 (Qreplace_buffer_in_windows, buffer); | 3647 | call1 (Qreplace_buffer_in_windows, buffer); |
| 3648 | } | 3648 | } |
| 3649 | 3649 | ||
| 3650 | /* If BUFFER is shown in a window, safely replace it with some other | 3650 | /** If BUFFER is shown in any window, safely replace it with some other |
| 3651 | buffer in all windows of all frames, even those on other keyboards. */ | 3651 | buffer in all windows of all frames, even those on other keyboards. |
| 3652 | 3652 | Do not delete any window. | |
| 3653 | |||
| 3654 | This function is called by Fkill_buffer when it detects that | ||
| 3655 | replacing BUFFER in some window showing BUFFER has failed. It | ||
| 3656 | assumes that ‘replace-buffer-in-windows’ has removed any entry | ||
| 3657 | referencing BUFFER from any window's lists of previous and next | ||
| 3658 | buffers and that window's ‘quit-restore’ and 'quit-restore-prev' | ||
| 3659 | parameters. | ||
| 3660 | */ | ||
| 3653 | void | 3661 | void |
| 3654 | replace_buffer_in_windows_safely (Lisp_Object buffer) | 3662 | replace_buffer_in_windows_safely (Lisp_Object buffer) |
| 3655 | { | 3663 | { |