From c0c4600eceaed7134918437db9a5ea9c0e4b0c18 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 8 Jul 2022 09:42:02 +0300 Subject: [PATCH] Fix calculation of the vertical scroll bar's thumb * src/xdisp.c (set_vertical_scroll_bar): Compute window's end position "by hand" if w->window_end_pos cannot be relied upon. --- src/xdisp.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/xdisp.c b/src/xdisp.c index 7821c120ca0..0b88b434bc2 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -18872,19 +18872,34 @@ set_vertical_scroll_bar (struct window *w) && NILP (echo_area_buffer[0]))) { struct buffer *buf = XBUFFER (w->contents); + ptrdiff_t window_end_pos = w->window_end_pos; + + /* If w->window_end_pos cannot be trusted, recompute it "the + hard way". */ + if (!w->window_end_valid) + { + struct it it; + struct text_pos start_pos; + + SET_TEXT_POS_FROM_MARKER (start_pos, w->start); + start_display (&it, w, start_pos); + move_it_to (&it, -1, it.last_visible_x, window_box_height (w), -1, + MOVE_TO_X | MOVE_TO_Y); + window_end_pos = BUF_Z (buf) - IT_CHARPOS (it); + } if (! BUFFER_AUTO_NARROWED_P (buf)) { whole = BUF_ZV (buf) - BUF_BEGV (buf); start = marker_position (w->start) - BUF_BEGV (buf); /* I don't think this is guaranteed to be right. For the moment, we'll pretend it is. */ - end = BUF_Z (buf) - w->window_end_pos - BUF_BEGV (buf); + end = BUF_Z (buf) - window_end_pos - BUF_BEGV (buf); } else { whole = BUF_Z (buf) - BUF_BEG (buf); start = marker_position (w->start) - BUF_BEG (buf); - end = BUF_Z (buf) - w->window_end_pos - BUF_BEG (buf); + end = BUF_Z (buf) - window_end_pos - BUF_BEG (buf); } if (end < start) -- 2.39.2