summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ChangeLog9
-rw-r--r--src/buffer.c37
2 files changed, 27 insertions, 19 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 55caf3c607c..6cef4f61f90 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,12 @@
+2012-04-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ Do not avoid creating empty evaporating overlays (Bug#9642).
+ * buffer.c (Fmove_overlay): Revert the change of 2012-04-23.
+ That is, do not delete an evaporating overlay if it becomes
+ empty after its bounds are adjusted to fit within its buffer.
+ This fix caused other problems, and I'm reverting it until we get
+ to the bottom of them.
+
2012-04-27 Chong Yidong <cyd@gnu.org>
* xselect.c (x_convert_selection): Initialize a pointer (Bug#11315).
diff --git a/src/buffer.c b/src/buffer.c
index 6c2e21c8125..9bac3ec742b 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3682,7 +3682,6 @@ buffer. */)
struct buffer *b, *ob;
Lisp_Object obuffer;
int count = SPECPDL_INDEX ();
- ptrdiff_t n_beg, n_end;
CHECK_OVERLAY (overlay);
if (NILP (buffer))
@@ -3701,23 +3700,15 @@ buffer. */)
CHECK_NUMBER_COERCE_MARKER (beg);
CHECK_NUMBER_COERCE_MARKER (end);
+ if (XINT (beg) == XINT (end) && ! NILP (Foverlay_get (overlay, Qevaporate)))
+ return Fdelete_overlay (overlay);
+
if (XINT (beg) > XINT (end))
{
Lisp_Object temp;
temp = beg; beg = end; end = temp;
}
- /* First set the overlay boundaries, which may clip them. */
- Fset_marker (OVERLAY_START (overlay), beg, buffer);
- Fset_marker (OVERLAY_END (overlay), end, buffer);
- n_beg = marker_position (OVERLAY_START (overlay));
- n_end = marker_position (OVERLAY_END (overlay));
-
- /* Now, delete the overlay if it is empty after clipping and has the
- evaporate property. */
- if (n_beg == n_end && ! NILP (Foverlay_get (overlay, Qevaporate)))
- return Fdelete_overlay (overlay);
-
specbind (Qinhibit_quit, Qt);
obuffer = Fmarker_buffer (OVERLAY_START (overlay));
@@ -3740,7 +3731,7 @@ buffer. */)
}
/* Redisplay where the overlay is going to be. */
- modify_overlay (b, n_beg, n_end);
+ modify_overlay (b, XINT (beg), XINT (end));
}
else
/* Redisplay the area the overlay has just left, or just enclosed. */
@@ -3750,12 +3741,16 @@ buffer. */)
o_beg = OVERLAY_POSITION (OVERLAY_START (overlay));
o_end = OVERLAY_POSITION (OVERLAY_END (overlay));
- if (o_beg == n_beg)
- modify_overlay (b, o_end, n_end);
- else if (o_end == n_end)
- modify_overlay (b, o_beg, n_beg);
+ if (o_beg == XINT (beg))
+ modify_overlay (b, o_end, XINT (end));
+ else if (o_end == XINT (end))
+ modify_overlay (b, o_beg, XINT (beg));
else
- modify_overlay (b, min (o_beg, n_beg), max (o_end, n_end));
+ {
+ if (XINT (beg) < o_beg) o_beg = XINT (beg);
+ if (XINT (end) > o_end) o_end = XINT (end);
+ modify_overlay (b, o_beg, o_end);
+ }
}
if (!NILP (obuffer))
@@ -3767,8 +3762,12 @@ buffer. */)
eassert (XOVERLAY (overlay)->next == NULL);
}
+ Fset_marker (OVERLAY_START (overlay), beg, buffer);
+ Fset_marker (OVERLAY_END (overlay), end, buffer);
+
/* Put the overlay on the wrong list. */
- if (n_end < b->overlay_center)
+ end = OVERLAY_END (overlay);
+ if (OVERLAY_POSITION (end) < b->overlay_center)
{
XOVERLAY (overlay)->next = b->overlays_after;
b->overlays_after = XOVERLAY (overlay);