From: Kim F. Storm Date: Fri, 15 Jul 2005 11:32:15 +0000 (+0000) Subject: Fix redisplay loop in last change. X-Git-Tag: emacs-pretest-22.0.90~8133 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=367d949f19aed79fd602be87ed492cb3ef944030;p=emacs.git Fix redisplay loop in last change. (IT_POS_VALID_AFTER_MOVE_P): New macro. (move_it_vertically_backward, move_it_by_lines): Use it. --- diff --git a/src/xdisp.c b/src/xdisp.c index 4bc68ce58fc..b8f2a4cb8bb 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -5873,6 +5873,15 @@ next_element_from_composition (it) Moving an iterator without producing glyphs ***********************************************************************/ +/* Check if iterator is at a position corresponding to a valid buffer + position after some move_it_ call. */ + +#define IT_POS_VALID_AFTER_MOVE_P(it) \ + ((it)->method == GET_FROM_STRING \ + ? IT_STRING_CHARPOS (*it) == 0 \ + : 1) + + /* Move iterator IT to a specified buffer or X position within one line on the display without producing glyphs. @@ -6386,7 +6395,7 @@ move_it_vertically_backward (it, dy) move_it_to (&it2, start_pos, -1, -1, it2.vpos + 1, MOVE_TO_POS | MOVE_TO_VPOS); } - while (it2.method != GET_FROM_BUFFER); + while (!IT_POS_VALID_AFTER_MOVE_P (&it2)); xassert (IT_CHARPOS (*it) >= BEGV); it3 = it2; @@ -6586,7 +6595,7 @@ move_it_by_lines (it, dvpos, need_y_p) else if (dvpos > 0) { move_it_to (it, -1, -1, -1, it->vpos + dvpos, MOVE_TO_VPOS); - if (it->method != GET_FROM_BUFFER) + if (!IT_POS_VALID_AFTER_MOVE_P (it)) move_it_to (it, IT_CHARPOS (*it) + 1, -1, -1, -1, MOVE_TO_POS); } else @@ -6608,13 +6617,13 @@ move_it_by_lines (it, dvpos, need_y_p) reseat (it, it->current.pos, 1); /* Move further back if we end up in a string or an image. */ - while (it->method != GET_FROM_BUFFER) + while (!IT_POS_VALID_AFTER_MOVE_P (it)) { /* First try to move to start of display line. */ dvpos += it->vpos; move_it_vertically_backward (it, 0); dvpos -= it->vpos; - if (it->method == GET_FROM_BUFFER) + if (IT_POS_VALID_AFTER_MOVE_P (it)) break; /* If start of line is still in string or image, move further back. */