1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-30 08:09:04 +00:00

Fix unexpected jumps of window-point in 'set-window-configuration' (Bug#31695)

* src/window.c (Fset_window_configuration): Prevent that the
fix for Bug#12208 affects restoration of window points when
using separate minibuffer frames (Bug#31695).
This commit is contained in:
Martin Rudalics 2018-06-07 09:59:38 +02:00
parent 4af077ab4d
commit 26b52ac40e

View File

@ -6610,10 +6610,10 @@ the return value is nil. Otherwise the value is t. */)
make_number (old_point),
XWINDOW (data->current_window)->contents);
/* In the following call to `select-window', prevent "swapping out
/* In the following call to select_window, prevent "swapping out
point" in the old selected window using the buffer that has
been restored into it. We already swapped out that point from
that window's old buffer.
been restored into it. We already swapped out that point
from that window's old buffer.
Do not record the buffer here. We do that in a separate call
to select_window below. See also Bug#16207. */
@ -6656,10 +6656,10 @@ the return value is nil. Otherwise the value is t. */)
if (WINDOW_LIVE_P (data->current_window))
select_window (data->current_window, Qnil, false);
/* Fselect_window will have made f the selected frame, so we
reselect the proper frame here. Fhandle_switch_frame will change the
selected window too, but that doesn't make the call to
Fselect_window above totally superfluous; it still sets f's
/* select_window will have made f the selected frame, so we
reselect the proper frame here. do_switch_frame will change
the selected window too, but that doesn't make the call to
select_window above totally superfluous; it still sets f's
selected window. */
if (FRAME_LIVE_P (XFRAME (data->selected_frame)))
do_switch_frame (data->selected_frame, 0, 0, Qnil);
@ -6696,8 +6696,21 @@ the return value is nil. Otherwise the value is t. */)
{
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)->contents, new_current_buffer))
window, go to its old point (Bug#12208).
The original fix used data->current_window below which caused
false positives (compare Bug#31695) when data->current_window
is not on data->selected_frame. This happens, for example,
when read_minibuf restores the configuration of a stand-alone
minibuffer frame: After switching to the previously selected
"normal" frame, point of that frame's selected window jumped
unexpectedly because new_current_buffer is usually *not*
shown in data->current_window - the minibuffer frame's
selected window. Using selected_window instead fixes this
because do_switch_frame has set up selected_window already to
the "normal" frame's selected window and that window *does*
show new_current_buffer. */
if (!EQ (XWINDOW (selected_window)->contents, new_current_buffer))
Fgoto_char (make_number (old_point));
}