/* Definitions and global variables for intervals.
- Copyright (C) 1990, 1992 Free Software Foundation, Inc.
+ Copyright (C) 1993 Free Software Foundation, Inc.
This file is part of GNU Emacs.
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifdef USE_TEXT_PROPERTIES
+#ifndef NORMAL_FACE
#include "dispextern.h"
+#endif
#define NULL_INTERVAL 0
#define INTERVAL_DEFAULT NULL_INTERVAL
/* True if an interval pointer is null, or is a Lisp_Buffer or
Lisp_String pointer (meaning it points to the owner of this
- interval tree.) */
-#define NULL_INTERVAL_P(i) ((i) == NULL_INTERVAL || \
- XTYPE ((Lisp_Object)(i)) == Lisp_Buffer || \
- XTYPE ((Lisp_Object)(i)) == Lisp_String)
+ interval tree). */
+#define NULL_INTERVAL_P(i) ((i) == NULL_INTERVAL \
+ || XTYPE ((Lisp_Object)(i)) == Lisp_Buffer \
+ || XTYPE ((Lisp_Object)(i)) == Lisp_String)
/* True if this interval has no right child. */
-#define NULL_RIGHT_CHILD(i) (NULL_INTERVAL_P((i)->right))
+#define NULL_RIGHT_CHILD(i) ((i)->right == NULL_INTERVAL)
/* True if this interval has no left child. */
-#define NULL_LEFT_CHILD(i) (NULL_INTERVAL_P((i)->left))
+#define NULL_LEFT_CHILD(i) ((i)->left == NULL_INTERVAL)
/* True if this interval has no parent. */
-#define NULL_PARENT(i) (NULL_INTERVAL_P((i)->parent))
+#define NULL_PARENT(i) (NULL_INTERVAL_P ((i)->parent))
/* True if this interval is the left child of some other interval. */
#define AM_LEFT_CHILD(i) (! NULL_INTERVAL_P ((i)->parent) \
&& (i)->parent->left == (i))
-/* True if this interval is the right ehild of some other interval. */
+/* True if this interval is the right child of some other interval. */
#define AM_RIGHT_CHILD(i) (! NULL_INTERVAL_P ((i)->parent) \
&& (i)->parent->right == (i))
#define ROOT_INTERVAL_P(i) (NULL_PARENT (i))
/* True if this interval is the only interval in the interval tree. */
-#define ONLY_INTERVAL_P(i) (ROOT_INTERVAL_P((i)) && LEAF_INTERVAL_P ((i)))
+#define ONLY_INTERVAL_P(i) (ROOT_INTERVAL_P ((i)) && LEAF_INTERVAL_P ((i)))
/* True if this interval has both left and right children. */
#define BOTH_KIDS_P(i) ((i)->left != NULL_INTERVAL \
#define DEFAULT_INTERVAL_P(i) (NULL_INTERVAL_P (i) || EQ ((i)->plist, Qnil))
/* Reset this interval to its vanilla, or no-property state. */
-#define RESET_INTERVAL(i) { \
- (i)->total_length = (i)->position = 0; \
- (i)->left = (i)->right = NULL_INTERVAL; \
- (i)->parent = NULL_INTERVAL; \
- (i)->write_protect = 0; \
- (i)->visible = 0; \
- (i)->front_sticky = (i)->rear_sticky = 0; \
- (i)->plist = Qnil; \
- }
+#define RESET_INTERVAL(i) \
+{ \
+ (i)->total_length = (i)->position = 0; \
+ (i)->left = (i)->right = NULL_INTERVAL; \
+ (i)->parent = NULL_INTERVAL; \
+ (i)->write_protect = 0; \
+ (i)->visible = 0; \
+ (i)->front_sticky = (i)->rear_sticky = 0; \
+ (i)->plist = Qnil; \
+}
/* Copy the cached property values of interval FROM to interval TO. */
#define COPY_INTERVAL_CACHE(from,to) \
/* Macro determining whether the properties of an interval being
inserted should be merged with the properties of the text where
they are being inserted. */
-#define MERGE_INSERTIONS(i) 0
+#define MERGE_INSERTIONS(i) 1
/* Macro determining if an invisible interval should be displayed
as a special glyph, or not at all. */
/* Is this interval visible? Replace later with cache access */
#define INTERVAL_VISIBLE_P(i) \
- (! NULL_INTERVAL_P (i) && ! NILP (Fmemq (Qinvisible, (i)->plist)))
+ (! NULL_INTERVAL_P (i) && NILP (textget ((i)->plist, Qinvisible)))
/* Is this interval writable? Replace later with cache access */
-#define INTERVAL_WRITABLE_P(i) \
- (! NULL_INTERVAL_P (i) && NILP (Fmemq (Qread_only, (i)->plist)))
+#define INTERVAL_WRITABLE_P(i) \
+ (! NULL_INTERVAL_P (i) \
+ && (NILP (textget ((i)->plist, Qread_only)) \
+ || ((CONSP (Vinhibit_read_only) \
+ ? !NILP (Fmemq (textget ((i)->plist, Qread_only), \
+ Vinhibit_read_only)) \
+ : !NILP (Vinhibit_read_only))))) \
/* Macros to tell whether insertions before or after this interval
should stick to it. */
-#define FRONT_STICKY_P(i) ((i)->front_sticky != 0)
-#define END_STICKY_P(i) ((i)->rear_sticky != 0)
+/* Replace later with cache access */
+/*#define FRONT_STICKY_P(i) ((i)->front_sticky != 0)
+ #define END_STICKY_P(i) ((i)->rear_sticky != 0)*/
+#define FRONT_STICKY_P(i) \
+ (! NULL_INTERVAL_P (i) && ! NILP (textget ((i)->plist, Qfront_sticky)))
+#define END_NONSTICKY_P(i) \
+ (! NULL_INTERVAL_P (i) && ! NILP (textget ((i)->plist, Qrear_nonsticky)))
/* Declared in alloc.c */
extern INTERVAL balance_intervals ();
extern INLINE void copy_intervals_to_string ();
extern INTERVAL copy_intervals ();
+extern Lisp_Object textget ();
+extern Lisp_Object textget_direct ();
+extern Lisp_Object get_local_map ();
/* Declared in textprop.c */
extern Lisp_Object Qmouse_entered;
extern Lisp_Object Qpoint_left;
extern Lisp_Object Qpoint_entered;
-extern Lisp_Object Qmodification;
+extern Lisp_Object Qmodification_hooks;
+extern Lisp_Object Qcategory;
+extern Lisp_Object Qlocal_map;
/* Visual properties text (including strings) may have. */
extern Lisp_Object Qforeground, Qbackground, Qfont, Qunderline, Qstipple;
-extern Lisp_Object Qinvisible, Qread_only;
+extern Lisp_Object Qinvisible, Qhidden, Qread_only;
+
+extern Lisp_Object Vinhibit_point_motion_hooks;
+
+/* Sticky properties */
+extern Lisp_Object Qfront_sticky, Qrear_nonsticky;
extern Lisp_Object Ftext_properties_at ();
extern Lisp_Object Fnext_property_change (), Fprevious_property_change ();
extern Lisp_Object Fadd_text_properties (), Fset_text_properties ();
extern Lisp_Object Fremove_text_properties (), Ferase_text_properties ();
+extern Lisp_Object Ftext_property_any (), Ftext_property_not_all ();
+extern Lisp_Object copy_text_properties ();
extern void syms_of_textprop ();