Mercurial > emacs
changeset 32912:b55f99786a33
(pos_visible_p): Change current buffer if necessary.
Handle obscured lines at the top of the window.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Thu, 26 Oct 2000 12:44:20 +0000 |
parents | 67ee3f53d728 |
children | 8a79f057b2a5 |
files | src/xdisp.c |
diffstat | 1 files changed, 37 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/xdisp.c Thu Oct 26 12:43:47 2000 +0000 +++ b/src/xdisp.c Thu Oct 26 12:44:20 2000 +0000 @@ -940,7 +940,14 @@ { struct it it; struct text_pos top; - int visible_p, bottom_y; + int visible_p; + struct buffer *old_buffer = NULL; + + if (XBUFFER (w->buffer) != current_buffer) + { + old_buffer = current_buffer; + set_buffer_internal_1 (XBUFFER (w->buffer)); + } *fully = visible_p = 0; SET_TEXT_POS_FROM_MARKER (top, w->start); @@ -951,15 +958,32 @@ if (IT_CHARPOS (it) == charpos) { - int line_height; - - if (it.max_ascent == 0 && it.max_descent == 0) - line_height = last_height; - else - line_height = it.max_ascent + it.max_descent; - - *fully = it.current_y + line_height <= it.last_visible_y; - visible_p = 1; + int line_height, line_bottom_y; + int line_top_y = it.current_y; + int window_top_y = WINDOW_DISPLAY_HEADER_LINE_HEIGHT (w); + + line_height = it.max_ascent + it.max_descent; + if (line_height == 0) + { + if (last_height) + line_height = last_height; + else + { + move_it_by_lines (&it, 1, 1); + line_height = (it.max_ascent || it.max_descent + ? it.max_ascent + it.max_descent + : last_height); + } + } + line_bottom_y = line_top_y + line_height; + + if (line_top_y < window_top_y) + visible_p = line_bottom_y > window_top_y; + else if (line_top_y < it.last_visible_y) + { + visible_p = 1; + *fully = line_bottom_y <= it.last_visible_y; + } } else if (it.current_y + it.max_ascent + it.max_descent > it.last_visible_y) { @@ -970,6 +994,9 @@ *fully = 0; } } + + if (old_buffer) + set_buffer_internal_1 (old_buffer); return visible_p; }