# HG changeset patch # User Stefan Monnier # Date 1052584562 0 # Node ID 5490960951c17e7da1dff6faea1a18e89c9dc9b8 # Parent ee3ba06bba1a845c12dc8a3c71f0395683960f66 (adjust_point_for_property): Try harder to move point to the non-sticky end of an invisible property. diff -r ee3ba06bba1a -r 5490960951c1 src/keyboard.c --- a/src/keyboard.c Sat May 10 16:27:35 2003 +0000 +++ b/src/keyboard.c Sat May 10 16:36:02 2003 +0000 @@ -1,5 +1,5 @@ /* Keyboard and mouse input; editor command loop. - Copyright (C) 1985,86,87,88,89,93,94,95,96,97,99, 2000, 01, 02 + Copyright (C) 1985,86,87,88,89,93,94,95,96,97,99,2000,01,02,03 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -1874,7 +1874,10 @@ int beg, end; Lisp_Object val, overlay, tmp; int check_composition = 1, check_display = 1, check_invisible = 1; - + int orig_pt = PT; + + /* FIXME: cycling is probably not necessary because these properties + can't be usefully combined anyway. */ while (check_composition || check_display || check_invisible) { if (check_composition @@ -1941,7 +1944,19 @@ /* Move away from the inside area. */ if (beg < PT && end > PT) { - SET_PT (PT < last_pt ? beg : end); + SET_PT ((orig_pt == PT && (last_pt < beg || last_pt > end)) + /* We haven't moved yet (so we don't need to fear + infinite-looping) and we were outside the range + before (so either end of the range still corresponds + to a move in the right direction): pretend we moved + less than we actually did, so that we still have + more freedom below in choosing which end of the range + to go to. */ + ? (PT < last_pt ? end : beg) + /* We either have moved already or the last point + was already in the range: we don't get to choose + which end of the range we have to go to. */ + : (PT < last_pt ? beg : end)); check_composition = check_display = 1; } xassert (PT == beg || PT == end);