Mercurial > emacs
changeset 32873:1dbdec58e580
(pos_visible_p): New function.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Wed, 25 Oct 2000 11:55:10 +0000 |
parents | 303e2612e332 |
children | 12f068b4d5ac |
files | src/xdisp.c |
diffstat | 1 files changed, 46 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/xdisp.c Wed Oct 25 11:54:27 2000 +0000 +++ b/src/xdisp.c Wed Oct 25 11:55:10 2000 +0000 @@ -929,6 +929,52 @@ Utilities ***********************************************************************/ +/* Return 1 if position CHARPOS is visible in window W. + Set *FULLY to 1 if POS is visible and the line containing + POS is fully visible. */ + +int +pos_visible_p (w, charpos, fully) + struct window *w; + int charpos, *fully; +{ + struct it it; + struct text_pos top; + int visible_p, bottom_y; + + *fully = visible_p = 0; + SET_TEXT_POS_FROM_MARKER (top, w->start); + start_display (&it, w, top); + + move_it_to (&it, charpos, 0, it.last_visible_y, -1, + MOVE_TO_POS | MOVE_TO_X | MOVE_TO_Y); + + if (IT_CHARPOS (it) == charpos) + { + int line_height; + + if (it.max_ascent == 0 && it.max_descent == 0) + line_height = it.current_y + last_height; + else + line_height = it.current_y + it.max_ascent + it.max_descent; + + *fully = it.current_y + line_height <= it.last_visible_y; + visible_p = 1; + } + else if (it.current_y + it.max_ascent + it.max_descent > it.last_visible_y) + { + move_it_by_lines (&it, 1, 0); + if (charpos < IT_CHARPOS (it)) + { + visible_p = 1; + *fully = 0; + } + } + + return visible_p; +} + + /* Return the next character from STR which is MAXLEN bytes long. Return in *LEN the length of the character. This is like STRING_CHAR_AND_LENGTH but never returns an invalid character. If