Fix 'move-to-window-line' when EOB is on last screen line

* src/window.c (displayed_window_lines): Fix an off-by-one error
when the bottom of the last display line is exactly at window's
last pixel.  Remove kludgey fix for TTY frames that is no longer
needed.  (Bug#15760)
(Fmove_to_window_line): Doc fix.

* doc/lispref/positions.texi (Screen Lines): Clarify and make more
accurate the documentation of 'move-to-window-line'.
This commit is contained in:
Eli Zaretskii 2016-06-27 18:27:58 +03:00
parent 8040d99b62
commit defdee72c4
2 changed files with 16 additions and 16 deletions

View file

@ -590,10 +590,12 @@ any buffer, whether or not it is currently displayed in some window.
@deffn Command move-to-window-line count
This function moves point with respect to the text currently displayed
in the selected window. It moves point to the beginning of the screen
line @var{count} screen lines from the top of the window. If
@var{count} is negative, that specifies a position
@w{@minus{}@var{count}} lines from the bottom (or the last line of the
buffer, if the buffer ends above the specified screen position).
line @var{count} screen lines from the top of the window; zero means
the topmost line. If @var{count} is negative, that specifies a
position @w{@minus{}@var{count}} lines from the bottom (or the last
line of the buffer, if the buffer ends above the specified screen
position); thus, @var{count} of -1 specifies the last fully visible
screen line of the window.
If @var{count} is @code{nil}, then point moves to the beginning of the
line in the middle of the window. If the absolute value of @var{count}
@ -604,8 +606,8 @@ location onto the screen.
In an interactive call, @var{count} is the numeric prefix argument.
The value returned is the window line number point has moved to, with
the top line in the window numbered 0.
The value returned is the screen line number point has moved to,
relative to the top line of the window.
@end deffn
@vindex move-to-window-group-line-function

View file

@ -5651,21 +5651,14 @@ displayed_window_lines (struct window *w)
bottom_y = line_bottom_y (&it);
bidi_unshelve_cache (itdata, false);
/* rms: On a non-window display,
the value of it.vpos at the bottom of the screen
seems to be 1 larger than window_box_height (w).
This kludge fixes a bug whereby (move-to-window-line -1)
when ZV is on the last screen line
moves to the previous screen line instead of the last one. */
if (! FRAME_WINDOW_P (XFRAME (w->frame)))
height++;
/* Add in empty lines at the bottom of the window. */
if (bottom_y < height)
{
int uy = FRAME_LINE_HEIGHT (it.f);
it.vpos += (height - bottom_y + uy - 1) / uy;
}
else if (bottom_y == height)
it.vpos++;
if (old_buffer)
set_buffer_internal (old_buffer);
@ -5940,7 +5933,12 @@ DEFUN ("move-to-window-line", Fmove_to_window_line, Smove_to_window_line,
doc: /* Position point relative to window.
ARG nil means position point at center of window.
Else, ARG specifies vertical position within the window;
zero means top of window, negative means relative to bottom of window. */)
zero means top of window, negative means relative to bottom
of window, -1 meaning the last fully visible display line
of the window.
Value is the screen line of the window point moved to, counting
from the top of the window. */)
(Lisp_Object arg)
{
struct window *w = XWINDOW (selected_window);