Mercurial > emacs
changeset 67234:f1564d57f6a1
(Fset_window_configuration): Don't accidentally copy the
window-point of one window to another.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Thu, 01 Dec 2005 16:25:15 +0000 |
parents | f8729e3300dc |
children | 47c70fd186b1 |
files | src/ChangeLog src/window.c |
diffstat | 2 files changed, 24 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog Thu Dec 01 02:17:15 2005 +0000 +++ b/src/ChangeLog Thu Dec 01 16:25:15 2005 +0000 @@ -1,3 +1,8 @@ +2005-12-01 Stefan Monnier <monnier@iro.umontreal.ca> + + * window.c (Fset_window_configuration): Don't accidentally copy the + window-point of one window to another. + 2005-11-30 L$,1 q(Brentey K,Aa(Broly <lorentey@elte.hu> * buffer.c (Fpop_to_buffer): Remove superfluous call to record_buffer.
--- a/src/window.c Thu Dec 01 02:17:15 2005 +0000 +++ b/src/window.c Thu Dec 01 16:25:15 2005 +0000 @@ -1969,7 +1969,7 @@ GCPRO1 (windows); best_window = Qnil; - for (; CONSP (windows); windows = CDR (windows)) + for (; CONSP (windows); windows = XCDR (windows)) { struct window *w; @@ -3667,7 +3667,7 @@ #endif set_buffer_internal (old); - if (!EQ (Vtemp_buffer_show_function, Qnil)) + if (!NILP (Vtemp_buffer_show_function)) call1 (Vtemp_buffer_show_function, buf); else { @@ -5831,7 +5831,23 @@ else { if (XBUFFER (new_current_buffer) == current_buffer) - old_point = PT; + /* The code further down "preserves point" by saving here PT in + old_point and then setting it later back into PT. When the + current-selected-window and the final-selected-window both show + the current buffer, this suffers from the problem that the + current PT is the window-point of the current-selected-window, + while the final PT is the point of the final-selected-window, so + this copy from one PT to the other would end up moving the + window-point of the final-selected-window to the window-point of + the current-selected-window. So we have to be careful which + point of the current-buffer we copy into old_point. */ + if (EQ (XWINDOW (data->current_window)->buffer, new_current_buffer) + && WINDOWP (selected_window) + && EQ (XWINDOW (selected_window)->buffer, new_current_buffer) + && !EQ (selected_window, data->current_window)) + old_point = XMARKER (XWINDOW (data->current_window)->pointm)->charpos; + else + old_point = PT; else /* BUF_PT (XBUFFER (new_current_buffer)) gives us the position of point in new_current_buffer as of the last time this buffer was