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