/* Interface code for dealing with text properties.
Copyright (C) 1993, 1994, 1995, 1997, 1999, 2000, 2001, 2002, 2003,
- 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+ 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of GNU Emacs.
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include <config.h>
+#include <setjmp.h>
#include "lisp.h"
#include "intervals.h"
#include "buffer.h"
/* Visual properties text (including strings) may have. */
Lisp_Object Qforeground, Qbackground, Qfont, Qunderline, Qstipple;
Lisp_Object Qinvisible, Qread_only, Qintangible, Qmouse_face;
+Lisp_Object Qminibuffer_prompt;
/* Sticky properties */
Lisp_Object Qfront_sticky, Qrear_nonsticky;
if (NILP (position))
{
if (NILP (limit))
- position = make_number (SCHARS (object));
+ position = make_number (0);
else
{
CHECK_NUMBER (limit);
/* Replace properties of text from START to END with new list of
properties PROPERTIES. OBJECT is the buffer or string containing
the text. OBJECT nil means use the current buffer.
- SIGNAL_AFTER_CHANGE_P nil means don't signal after changes. Value
- is nil if the function _detected_ that it did not replace any
- properties, non-nil otherwise. */
+ COHERENT_CHANGE_P nil means this is being called as an internal
+ subroutine, rather than as a change primitive with checking of
+ read-only, invoking change hooks, etc.. Value is nil if the
+ function _detected_ that it did not replace any properties, non-nil
+ otherwise. */
Lisp_Object
-set_text_properties (start, end, properties, object, signal_after_change_p)
- Lisp_Object start, end, properties, object, signal_after_change_p;
+set_text_properties (start, end, properties, object, coherent_change_p)
+ Lisp_Object start, end, properties, object, coherent_change_p;
{
register INTERVAL i;
Lisp_Object ostart, oend;
return Qnil;
}
- if (BUFFERP (object))
+ if (BUFFERP (object) && !NILP (coherent_change_p))
modify_region (XBUFFER (object), XINT (start), XINT (end), 1);
set_text_properties_1 (start, end, properties, object, i);
- if (BUFFERP (object) && !NILP (signal_after_change_p))
+ if (BUFFERP (object) && !NILP (coherent_change_p))
signal_after_change (XINT (start), XINT (end) - XINT (start),
XINT (end) - XINT (start));
return Qt;
-/* Modify end-points of ranges in LIST destructively. LIST is a list
- as returned from text_property_list. Change end-points equal to
- OLD_END to NEW_END. */
+/* Modify end-points of ranges in LIST destructively, and return the
+ new list. LIST is a list as returned from text_property_list.
+ Discard properties that begin at or after NEW_END, and limit
+ end-points to NEW_END. */
-void
-extend_property_ranges (list, old_end, new_end)
- Lisp_Object list, old_end, new_end;
+Lisp_Object
+extend_property_ranges (list, new_end)
+ Lisp_Object list, new_end;
{
- for (; CONSP (list); list = XCDR (list))
+ Lisp_Object prev = Qnil, head = list;
+ int max = XINT (new_end);
+
+ for (; CONSP (list); prev = list, list = XCDR (list))
{
- Lisp_Object item, end;
+ Lisp_Object item, beg, end;
item = XCAR (list);
+ beg = XCAR (item);
end = XCAR (XCDR (item));
- if (EQ (end, old_end))
+ if (XINT (beg) >= max)
+ {
+ /* The start-point is past the end of the new string.
+ Discard this property. */
+ if (EQ (head, list))
+ head = XCDR (list);
+ else
+ XSETCDR (prev, XCDR (list));
+ }
+ else if (XINT (end) > max)
+ /* The end-point is past the end of the new string. */
XSETCAR (XCDR (item), new_end);
}
+
+ return head;
}
`rear-nonsticky' properties of the character override NONSTICKINESS. */);
/* Text property `syntax-table' should be nonsticky by default. */
Vtext_property_default_nonsticky
- = Fcons (Fcons (intern ("syntax-table"), Qt), Qnil);
+ = Fcons (Fcons (intern_c_string ("syntax-table"), Qt), Qnil);
staticpro (&interval_insert_behind_hooks);
staticpro (&interval_insert_in_front_hooks);
/* Common attributes one might give text */
staticpro (&Qforeground);
- Qforeground = intern ("foreground");
+ Qforeground = intern_c_string ("foreground");
staticpro (&Qbackground);
- Qbackground = intern ("background");
+ Qbackground = intern_c_string ("background");
staticpro (&Qfont);
- Qfont = intern ("font");
+ Qfont = intern_c_string ("font");
staticpro (&Qstipple);
- Qstipple = intern ("stipple");
+ Qstipple = intern_c_string ("stipple");
staticpro (&Qunderline);
- Qunderline = intern ("underline");
+ Qunderline = intern_c_string ("underline");
staticpro (&Qread_only);
- Qread_only = intern ("read-only");
+ Qread_only = intern_c_string ("read-only");
staticpro (&Qinvisible);
- Qinvisible = intern ("invisible");
+ Qinvisible = intern_c_string ("invisible");
staticpro (&Qintangible);
- Qintangible = intern ("intangible");
+ Qintangible = intern_c_string ("intangible");
staticpro (&Qcategory);
- Qcategory = intern ("category");
+ Qcategory = intern_c_string ("category");
staticpro (&Qlocal_map);
- Qlocal_map = intern ("local-map");
+ Qlocal_map = intern_c_string ("local-map");
staticpro (&Qfront_sticky);
- Qfront_sticky = intern ("front-sticky");
+ Qfront_sticky = intern_c_string ("front-sticky");
staticpro (&Qrear_nonsticky);
- Qrear_nonsticky = intern ("rear-nonsticky");
+ Qrear_nonsticky = intern_c_string ("rear-nonsticky");
staticpro (&Qmouse_face);
- Qmouse_face = intern ("mouse-face");
+ Qmouse_face = intern_c_string ("mouse-face");
+ staticpro (&Qminibuffer_prompt);
+ Qminibuffer_prompt = intern_c_string ("minibuffer-prompt");
/* Properties that text might use to specify certain actions */
staticpro (&Qmouse_left);
- Qmouse_left = intern ("mouse-left");
+ Qmouse_left = intern_c_string ("mouse-left");
staticpro (&Qmouse_entered);
- Qmouse_entered = intern ("mouse-entered");
+ Qmouse_entered = intern_c_string ("mouse-entered");
staticpro (&Qpoint_left);
- Qpoint_left = intern ("point-left");
+ Qpoint_left = intern_c_string ("point-left");
staticpro (&Qpoint_entered);
- Qpoint_entered = intern ("point-entered");
+ Qpoint_entered = intern_c_string ("point-entered");
defsubr (&Stext_properties_at);
defsubr (&Sget_text_property);