Commit 5b5953c0 authored by Eli Zaretskii's avatar Eli Zaretskii

Fix bug #17905 with display of point in partially visible line at end of window.

 src/xdisp.c (redisplay_window): If redisplay of a window ends up
 with point in a partially visible line at end of the window, make
 sure the amended position of point actually has smaller Y
 coordinate; if not, give up and scroll the display.
 src/window.c (window_scroll_pixel_based): When point ends up at the
 last fully visible line, don't let move_it_to stop at the left
 edge of the line and dupe us into thinking point is inside the
 scroll margin.
parent f0f34bc8
2014-07-04 Eli Zaretskii <eliz@gnu.org>
* xdisp.c (redisplay_window): If redisplay of a window ends up
with point in a partially visible line at end of the window, make
sure the amended position of point actually has smaller Y
coordinate; if not, give up and scroll the display. (Bug#17905)
* window.c (window_scroll_pixel_based): When point ends up at the
last fully visible line, don't let move_it_to stop at the left
edge of the line and dupe us into thinking point is inside the
scroll margin.
* w32.c (network_interface_info): Make sure the argument is a
Lisp string.
......
......@@ -5167,6 +5167,32 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, int noerror)
charpos = IT_CHARPOS (it);
bytepos = IT_BYTEPOS (it);
/* If PT is in the screen line at the last fully visible line,
move_it_to will stop at X = 0 in that line, because the
required Y coordinate is reached there. See if we can get to
PT without descending lower in Y, and if we can, it means we
reached PT before the scroll margin. */
if (charpos != PT)
{
struct it it2;
void *it_data;
it2 = it;
it_data = bidi_shelve_cache ();
move_it_to (&it, PT, -1, -1, -1, MOVE_TO_POS);
if (IT_CHARPOS (it) == PT && it.current_y == it2.current_y)
{
charpos = IT_CHARPOS (it);
bytepos = IT_BYTEPOS (it);
bidi_unshelve_cache (it_data, 1);
}
else
{
it = it2;
bidi_unshelve_cache (it_data, 0);
}
}
/* See if point is on a partially visible line at the end. */
if (it.what == IT_EOB)
partial_p = it.current_y + it.ascent + it.descent > it.last_visible_y;
......
......@@ -16106,6 +16106,18 @@ redisplay_window (Lisp_Object window, bool just_this_one_p)
/* Point does appear, but on a line partly visible at end of window.
Move it back to a fully-visible line. */
new_vpos = window_box_height (w);
/* But if window_box_height suggests a Y coordinate that is
not less than we already have, that line will clearly not
be fully visible, so give up and scroll the display.
This can happen when the default face uses a font whose
dimensions are different from the frame's default
font. */
if (new_vpos >= w->cursor.y)
{
w->cursor.vpos = -1;
clear_glyph_matrix (w->desired_matrix);
goto try_to_scroll;
}
}
else if (w->cursor.vpos >= 0)
{
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment