changeset 98070:b0d74e2658b7

(Fbuffer_swap_text): Reset window->point markers.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sun, 07 Sep 2008 01:22:25 +0000
parents 43a801a18b24
children c94db6d7eda9
files src/ChangeLog src/buffer.c
diffstat 2 files changed, 24 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sun Sep 07 01:14:58 2008 +0000
+++ b/src/ChangeLog	Sun Sep 07 01:22:25 2008 +0000
@@ -1,3 +1,7 @@
+2008-09-07  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* buffer.c (Fbuffer_swap_text): Reset window->point markers.
+
 2008-09-06  Roland Winkler  <Roland.Winkler@physik.uni-erlangen.de>
 
 	* process.c (Fsystem_process_attributes): Doc fix.
--- a/src/buffer.c	Sun Sep 07 01:14:58 2008 +0000
+++ b/src/buffer.c	Sun Sep 07 01:22:25 2008 +0000
@@ -2269,6 +2269,26 @@
       if (m->buffer == current_buffer)
 	m->buffer = other_buffer;
   }
+  { /* Some of the C code expects that w->buffer == w->pointm->buffer.
+       So since we just swapped the markers between the two buffers, we need
+       to undo the effect of this swap for window markers.  */
+    Lisp_Object w = Fselected_window (), ws = Qnil;
+    Lisp_Object buf1, buf2;
+    XSETBUFFER (buf1, current_buffer); XSETBUFFER (buf2, other_buffer);
+
+    while (NILP (Fmemq (w, ws)))
+      {
+	ws = Fcons (w, ws);
+	if (MARKERP (XWINDOW (w)->pointm)
+	    && (EQ (XWINDOW (w)->buffer, buf1)
+		|| EQ (XWINDOW (w)->buffer, buf2)))
+	  Fset_marker (XWINDOW (w)->pointm,
+		       make_number (BUF_BEGV (XBUFFER (XWINDOW (w)->buffer))),
+		       XWINDOW (w)->buffer);
+	w = Fnext_window (w, Qt, Qt);
+      }
+  }
+
   if (current_buffer->text->intervals)
     (eassert (EQ (current_buffer->text->intervals->up.obj, buffer)),
      XSETBUFFER (current_buffer->text->intervals->up.obj, current_buffer));