Mercurial > emacs
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));