summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1997-05-31 07:38:44 +0000
committerRichard M. Stallman <rms@gnu.org>1997-05-31 07:38:44 +0000
commit9a81d62e8d5e31332b44c315da9fff792f924780 (patch)
tree0915beb8bd914664de750cd469692ac045cb3d8d /src
parent081c9c581ba66188e853cb17428a46dc93113c9f (diff)
downloademacs-9a81d62e8d5e31332b44c315da9fff792f924780.tar.gz
(move_if_not_intangible): New function.
Diffstat (limited to 'src')
-rw-r--r--src/intervals.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/intervals.c b/src/intervals.c
index e93c2b495a5..ce2adc375f3 100644
--- a/src/intervals.c
+++ b/src/intervals.c
@@ -1853,6 +1853,62 @@ temp_set_point (position, buffer)
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. */