aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Rudalics2024-09-11 10:36:14 +0200
committerMartin Rudalics2024-09-11 10:36:14 +0200
commitfc3a7f45292b9a7be95fdefd24fedb7e8f564d1c (patch)
tree42c8f350f181c8705564f4320054c0fdaefbba77 /src
parent74ea24233ca281b19c3e3d2552621ceac30dfc48 (diff)
downloademacs-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.c20
-rw-r--r--src/window.c14
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*/
3653void 3661void
3654replace_buffer_in_windows_safely (Lisp_Object buffer) 3662replace_buffer_in_windows_safely (Lisp_Object buffer)
3655{ 3663{