Commit c4b6914d authored by Martin Rudalics's avatar Martin Rudalics

Address two problems in Fset_window_configuration (Bug#8789) and (Bug#12208).

* window.c (Fset_window_configuration): Record any window's old
buffer if it's replaced (see Bug#8789).  If the new current
buffer doesn't appear in the selected window, go to its old
point (Bug#12208).
parent 35aaa1ea
2012-08-27 Martin Rudalics <rudalics@gmx.at>
* window.c (Fset_window_configuration): Record any window's old
buffer if it's replaced (see Bug#8789). If the new current
buffer doesn't appear in the selected window, go to its old
point (Bug#12208).
2012-08-27 Dmitry Antipov <dmantipov@yandex.ru>
Special MEM_TYPE_SPARE to denote reserved memory.
......
......@@ -1969,6 +1969,9 @@ unshow_buffer (register struct window *w)
is actually stored in that buffer, and the window's pointm isn't used.
So don't clobber point in that buffer. */
if (! EQ (buf, XWINDOW (selected_window)->buffer)
/* Don't clobber point in current buffer either (this could be
useful in connection with bug#12208).
&& XBUFFER (buf) != current_buffer */
/* This line helps to fix Horsley's testbug.el bug. */
&& !(WINDOWP (BVAR (b, last_selected_window))
&& w != XWINDOW (BVAR (b, last_selected_window))
......@@ -3135,7 +3138,7 @@ run_window_configuration_change_hook (struct frame *f)
DEFUN ("run-window-configuration-change-hook", Frun_window_configuration_change_hook,
Srun_window_configuration_change_hook, 1, 1, 0,
doc: /* Run `window-configuration-change-hook' for FRAME. */)
(Lisp_Object frame)
(Lisp_Object frame)
{
CHECK_LIVE_FRAME (frame);
run_window_configuration_change_hook (XFRAME (frame));
......@@ -5613,6 +5616,24 @@ the return value is nil. Otherwise the value is t. */)
int previous_frame_menu_bar_lines = FRAME_MENU_BAR_LINES (f);
int previous_frame_tool_bar_lines = FRAME_TOOL_BAR_LINES (f);
/* Don't do this within the main loop below: This may call Lisp
code and is thus potentially unsafe while input is blocked. */
for (k = 0; k < saved_windows->header.size; k++)
{
p = SAVED_WINDOW_N (saved_windows, k);
window = p->window;
w = XWINDOW (window);
if (!NILP (p->buffer)
&& ((!EQ (w->buffer, p->buffer)
&& !NILP (BVAR (XBUFFER (p->buffer), name)))
|| NILP (w->buffer)
|| NILP (BVAR (XBUFFER (w->buffer), name))))
/* Record old buffer of window when its buffer is going to
change. */
call1 (Qrecord_window_buffer, window);
}
/* The mouse highlighting code could get screwed up
if it runs during this. */
BLOCK_INPUT;
......@@ -5900,7 +5921,13 @@ the return value is nil. Otherwise the value is t. */)
}
if (!NILP (new_current_buffer))
Fset_buffer (new_current_buffer);
{
Fset_buffer (new_current_buffer);
/* If the new current buffer doesn't appear in the selected
window, go to its old point (see bug#12208). */
if (!EQ (XWINDOW (data->current_window)->buffer, new_current_buffer))
Fgoto_char (make_number (old_point));
}
Vminibuf_scroll_window = data->minibuf_scroll_window;
minibuf_selected_window = data->minibuf_selected_window;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment