(x_iconify_frame): If frame is invisible, explicitly mark it as iconified.
[bpt/emacs.git] / src / intervals.h
index 7a6c910..9b778c1 100644 (file)
@@ -1,11 +1,11 @@
 /* Definitions and global variables for intervals.
 /* Definitions and global variables for intervals.
-   Copyright (C) 1993 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1994 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
@@ -15,7 +15,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 #ifdef USE_TEXT_PROPERTIES
 #ifndef NORMAL_FACE
 
 #ifdef USE_TEXT_PROPERTIES
 #ifndef NORMAL_FACE
@@ -35,25 +36,25 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 /* True if an interval pointer is null, or is a Lisp_Buffer or
    Lisp_String pointer (meaning it points to the owner of this
 
 /* 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           \
+                           || BUFFERP ((Lisp_Object)(i)) \
+                           || STRINGP ((Lisp_Object)(i)))
 
 /* True if this interval has no right child. */
 
 /* 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. */
 
 /* 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. */
 
 /* 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 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 AM_RIGHT_CHILD(i) (! NULL_INTERVAL_P ((i)->parent) \
                           && (i)->parent->right == (i))
 
@@ -65,7 +66,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define ROOT_INTERVAL_P(i) (NULL_PARENT (i))
 
 /* True if this interval is the only interval in the interval tree. */
 #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     \
 
 /* True if this interval has both left and right children. */
 #define BOTH_KIDS_P(i) ((i)->left != NULL_INTERVAL     \
@@ -80,9 +81,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                                               - TOTAL_LENGTH ((i)->right) \
                                               - TOTAL_LENGTH ((i)->left)))
 
                                               - TOTAL_LENGTH ((i)->right) \
                                               - TOTAL_LENGTH ((i)->left)))
 
-/* The absolute index of the last character belonging to I.  Note that
+/* The position of the character just past the end of I.  Note that
    the position cache i->position must be valid for this to work. */
    the position cache i->position must be valid for this to work. */
-#define INTERVAL_LAST_POS(i) ((i)->position + LENGTH ((i)) - 1)
+#define INTERVAL_LAST_POS(i) ((i)->position + LENGTH ((i)))
 
 /* The total size of the left subtree of this interval. */
 #define LEFT_TOTAL_LENGTH(i) ((i)->left ? (i)->left->total_length : 0)
 
 /* The total size of the left subtree of this interval. */
 #define LEFT_TOTAL_LENGTH(i) ((i)->left ? (i)->left->total_length : 0)
@@ -98,15 +99,16 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define DEFAULT_INTERVAL_P(i) (NULL_INTERVAL_P (i) || EQ ((i)->plist, Qnil))
 
 /* Reset this interval to its vanilla, or no-property state. */
 #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) \
 
 /* Copy the cached property values of interval FROM to interval TO. */
 #define COPY_INTERVAL_CACHE(from,to) \
@@ -129,7 +131,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 /* Macro determining whether the properties of an interval being
    inserted should be merged with the properties of the text where
    they are being inserted. */
 /* 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. */
 
 /* Macro determining if an invisible interval should be displayed
    as a special glyph, or not at all. */
@@ -150,9 +152,31 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 /* Macros to tell whether insertions before or after this interval
    should stick to it. */
 
 /* 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)))
+
+
+/* If PROP is the `invisible' property of a character,
+   this is 1 if the character should be treated as invisible.  */
+
+#define TEXT_PROP_MEANS_INVISIBLE(prop)                                \
+  (EQ (current_buffer->invisibility_spec, Qt)                  \
+   ? ! NILP (prop)                                             \
+   : invisible_p (prop, current_buffer->invisibility_spec))
 
 
+/* If PROP is the `invisible' property of a character,
+   this is 1 if the character should be treated as invisible
+   and should have an ellipsis.  */
+
+#define TEXT_PROP_MEANS_INVISIBLE_WITH_ELLIPSIS(prop)          \
+  (EQ (current_buffer->invisibility_spec, Qt)                  \
+   ? 0                                                         \
+   : invisible_ellipsis_p (prop, current_buffer->invisibility_spec))
 
 /* Declared in alloc.c */
 
 
 /* Declared in alloc.c */
 
@@ -160,8 +184,6 @@ extern INTERVAL make_interval ();
 
 /* Declared in intervals.c */
 
 
 /* Declared in intervals.c */
 
-extern Lisp_Object interval_balance_threshold;
-
 extern INTERVAL create_root_interval ();
 extern void copy_properties ();
 extern int intervals_equal ();
 extern INTERVAL create_root_interval ();
 extern void copy_properties ();
 extern int intervals_equal ();
@@ -195,12 +217,21 @@ extern Lisp_Object Qlocal_map;
 
 /* Visual properties text (including strings) may have. */
 extern Lisp_Object Qforeground, Qbackground, Qfont, Qunderline, Qstipple;
 
 /* 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, Qintangible, Qread_only;
+
+extern Lisp_Object Vinhibit_point_motion_hooks;
+extern Lisp_Object Vdefault_text_properties;
+
+/* Sticky properties */
+extern Lisp_Object Qfront_sticky, Qrear_nonsticky;
 
 
+extern Lisp_Object Fget_char_property (), Fget_text_property ();
 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_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 ();
 
 
 extern void syms_of_textprop ();