Lisp_Object Qoverlayp;
-Lisp_Object Qpriority, Qwindow;
+Lisp_Object Qpriority, Qwindow, Qevaporate;
Lisp_Object Qmodification_hooks;
Lisp_Object Qinsert_in_front_hooks;
CHECK_NUMBER_COERCE_MARKER (beg, 1);
CHECK_NUMBER_COERCE_MARKER (end, 1);
- specbind (Qinhibit_quit, Qt);
+ if (XINT (beg) == XINT (end) && ! NILP (Foverlay_get (overlay, Qevaporate)))
+ return Fdelete_overlay (overlay);
if (XINT (beg) > XINT (end))
{
temp = beg; beg = end; end = temp;
}
+ specbind (Qinhibit_quit, Qt);
+
obuffer = Fmarker_buffer (OVERLAY_START (overlay));
b = XBUFFER (buffer);
ob = XBUFFER (obuffer);
Lisp_Object overlay, prop, value;
{
Lisp_Object plist, tail, buffer;
+ int changed;
CHECK_OVERLAY (overlay, 0);
tail = XCONS (XCONS (tail)->cdr)->cdr)
if (EQ (XCONS (tail)->car, prop))
{
- /* If actually changing the property, mark redisplay needed. */
- if (! NILP (buffer) && !EQ (XCONS (XCONS (tail)->cdr)->car, value))
- redisplay_region (XBUFFER (buffer),
- marker_position (OVERLAY_START (overlay)),
- marker_position (OVERLAY_END (overlay)));
-
- return XCONS (XCONS (tail)->cdr)->car = value;
+ changed = !EQ (XCONS (XCONS (tail)->cdr)->car, value);
+ XCONS (XCONS (tail)->cdr)->car = value;
+ goto found;
}
-
- /* Actually changing the property; mark redisplay needed. */
- if (! NILP (buffer))
- redisplay_region (XBUFFER (buffer),
- marker_position (OVERLAY_START (overlay)),
- marker_position (OVERLAY_END (overlay)));
-
+ /* It wasn't in the list, so add it to the front. */
+ changed = !NILP (value);
if (! CONSP (XCONS (overlay)->cdr))
XCONS (overlay)->cdr = Fcons (Qnil, Qnil);
-
- XCONS (XCONS (overlay)->cdr)->cdr
- = Fcons (prop, Fcons (value, plist));
-
+ XCONS (XCONS (overlay)->cdr)->cdr = Fcons (prop, Fcons (value, plist));
+ found:
+ if (! NILP (buffer))
+ {
+ if (changed)
+ redisplay_region (XBUFFER (buffer),
+ marker_position (OVERLAY_START (overlay)),
+ marker_position (OVERLAY_END (overlay)));
+ if (EQ (prop, Qevaporate) && ! NILP (value)
+ && (OVERLAY_POSITION (OVERLAY_START (overlay))
+ == OVERLAY_POSITION (OVERLAY_END (overlay))))
+ Fdelete_overlay (overlay);
+ }
return value;
}
\f
}
UNGCPRO;
}
+
+/* Delete any zero-sized overlays at position POS, if the `evaporate'
+ property is set. */
+void
+evaporate_overlays (pos)
+ int pos;
+{
+ Lisp_Object tail, overlay, hit_list;
+
+ hit_list = Qnil;
+ if (pos <= XFASTINT (current_buffer->overlay_center))
+ for (tail = current_buffer->overlays_before; CONSP (tail);
+ tail = XCONS (tail)->cdr)
+ {
+ int endpos;
+ overlay = XCONS (tail)->car;
+ endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
+ if (endpos < pos)
+ break;
+ if (endpos == pos && OVERLAY_POSITION (OVERLAY_START (overlay)) == pos
+ && Foverlay_get (overlay, Qevaporate))
+ hit_list = Fcons (overlay, hit_list);
+ }
+ else
+ for (tail = current_buffer->overlays_after; CONSP (tail);
+ tail = XCONS (tail)->cdr)
+ {
+ int startpos;
+ overlay = XCONS (tail)->cdr;
+ startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
+ if (startpos > pos)
+ break;
+ if (startpos == pos && OVERLAY_POSITION (OVERLAY_END (overlay)) == pos
+ && Foverlay_get (overlay, Qevaporate))
+ hit_list = Fcons (overlay, hit_list);
+ }
+ for (; CONSP (hit_list); hit_list = XCONS (hit_list)->cdr)
+ Fdelete_overlay (XCONS (hit_list)->car);
+}
\f
/* Somebody has tried to store NEWVAL into the buffer-local slot with
offset XUINT (valcontents), and NEWVAL has an unacceptable type. */
staticpro (&Qpermanent_local);
staticpro (&Qkill_buffer_hook);
staticpro (&Qoverlayp);
+ Qevaporate = intern ("evaporate");
+ staticpro (&Qevaporate);
staticpro (&Qmodification_hooks);
Qmodification_hooks = intern ("modification-hooks");
staticpro (&Qinsert_in_front_hooks);