]> code.delx.au - gnu-emacs/blobdiff - src/buffer.c
* buffer.c (Fmove_overlay): If the overlay is changing buffers,
[gnu-emacs] / src / buffer.c
index b50e7d0f1b02dfaad98b399f529f055a9d9384ca..551898163f1560a450088a0f777d96995dfd1aef 100644 (file)
@@ -1566,26 +1566,30 @@ buffer.")
 
   b = XBUFFER (buffer);
 
-  /* Redisplay the area the overlay has just left, or just enclosed.  */
-  {
-    Lisp_Object o_beg = OVERLAY_START (overlay);
-    Lisp_Object o_end = OVERLAY_END   (overlay);
-    int change_beg, change_end;
-
-    o_beg = OVERLAY_POSITION (o_beg);
-    o_end = OVERLAY_POSITION (o_end);
-
-    if (XINT (o_beg) == XINT (beg))
-      redisplay_region (b, XINT (o_end), XINT (end));
-    else if (XINT (o_end) == XINT (end))
-      redisplay_region (b, XINT (o_beg), XINT (beg));
-    else
-      {
-       if (XINT (beg) < XINT (o_beg)) o_beg = beg;
-       if (XINT (end) > XINT (o_end)) o_end = end;
-       redisplay_region (b, XINT (o_beg), XINT (o_end));
-      }
-  }
+  /* If the overlay has changed buffers, do a thorough redisplay.  */
+  if (! EQ (buffer, XMARKER (OVERLAY_START (overlay))->buffer))
+    windows_or_buffers_changed = 1;
+  else
+    /* Redisplay the area the overlay has just left, or just enclosed.  */
+    {
+      Lisp_Object o_beg = OVERLAY_START (overlay);
+      Lisp_Object o_end = OVERLAY_END   (overlay);
+      int change_beg, change_end;
+
+      o_beg = OVERLAY_POSITION (o_beg);
+      o_end = OVERLAY_POSITION (o_end);
+
+      if (XINT (o_beg) == XINT (beg))
+       redisplay_region (b, XINT (o_end), XINT (end));
+      else if (XINT (o_end) == XINT (end))
+       redisplay_region (b, XINT (o_beg), XINT (beg));
+      else
+       {
+         if (XINT (beg) < XINT (o_beg)) o_beg = beg;
+         if (XINT (end) > XINT (o_end)) o_end = end;
+         redisplay_region (b, XINT (o_beg), XINT (o_end));
+       }
+    }
 
   b->overlays_before = Fdelq (overlay, b->overlays_before);
   b->overlays_after  = Fdelq (overlay, b->overlays_after);