]> code.delx.au - gnu-emacs/commitdiff
(Fbuffer_swap_text): Reset window->point markers.
authorStefan Monnier <monnier@iro.umontreal.ca>
Sun, 7 Sep 2008 01:22:25 +0000 (01:22 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sun, 7 Sep 2008 01:22:25 +0000 (01:22 +0000)
src/ChangeLog
src/buffer.c

index d5ee811e5a6d5aaa88f16104aa201c32d085fac8..96e1062af0dc09b4d37d6e239adbe00a6b058d0b 100644 (file)
@@ -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.
index 70283ffb18aeb419ddf77f10f867250d5ac29653..f55bcd3d415d19cb7efd29787b04da98f5ea5470 100644 (file)
@@ -2269,6 +2269,26 @@ DEFUN ("buffer-swap-text", Fbuffer_swap_text, Sbuffer_swap_text,
       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));