changeset 18076:1a2e6b512688

(move_if_not_intangible): New function.
author Richard M. Stallman <rms@gnu.org>
date Sat, 31 May 1997 07:38:44 +0000
parents 0e7d01cc4fa8
children 27a0ced43e7e
files src/intervals.c
diffstat 1 files changed, 56 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/intervals.c	Sat May 31 07:38:11 1997 +0000
+++ b/src/intervals.c	Sat May 31 07:38:44 1997 +0000
@@ -1853,6 +1853,62 @@
   BUF_PT (buffer) = position;
 }
 
+/* Move point to POSITION, unless POSITION is inside an intangible
+   segment that reaches all the way to point.  */
+
+void
+move_if_not_intangible (position)
+     int position;
+{
+  Lisp_Object pos;
+  Lisp_Object intangible_propval;
+
+  XSETINT (pos, position);
+
+  if (! NILP (Vinhibit_point_motion_hooks))
+    /* If intangible is inhibited, always move point to POSITION.  */
+    ;
+  else if (PT < position)
+    {
+      /* We want to move forward, so check the text before POSITION.  */
+
+      intangible_propval = Fget_char_property (pos,
+					       Qintangible, Qnil);
+
+      /* If following char is intangible,
+	 skip back over all chars with matching intangible property.  */
+      if (! NILP (intangible_propval))
+	while (XINT (pos) > BEGV
+	       && EQ (Fget_char_property (make_number (XINT (pos) - 1),
+					  Qintangible, Qnil),
+		      intangible_propval))
+	  pos = Fprevious_char_property_change (pos, Qnil);
+    }
+  else
+    {
+      /* We want to move backward, so check the text after POSITION.  */
+
+      intangible_propval = Fget_char_property (make_number (XINT (pos) - 1),
+					       Qintangible, Qnil);
+
+      /* If following char is intangible,
+	 skip back over all chars with matching intangible property.  */
+      if (! NILP (intangible_propval))
+	while (XINT (pos) < ZV
+	       && EQ (Fget_char_property (pos, Qintangible, Qnil),
+		      intangible_propval))
+	  pos = Fnext_char_property_change (pos, Qnil);
+
+    }
+
+  /* If the whole stretch between PT and POSITION isn't intangible, 
+     try moving to POSITION (which means we actually move farther
+     if POSITION is inside of intangible text).  */
+
+  if (XINT (pos) != PT)
+    SET_PT (position);
+}
+
 /* Return the proper local map for position POSITION in BUFFER.
    Use the map specified by the local-map property, if any.
    Otherwise, use BUFFER's local map.  */