From: Richard M. Stallman Date: Sat, 31 May 1997 07:38:44 +0000 (+0000) Subject: (move_if_not_intangible): New function. X-Git-Tag: emacs-20.1~1870 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a7fa233fe7cdaf7ae15973ecc3c93286af093ea4;p=emacs.git (move_if_not_intangible): New function. --- 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. */