]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix calculation of the vertical scroll bar's thumb
authorEli Zaretskii <eliz@gnu.org>
Fri, 8 Jul 2022 06:42:02 +0000 (09:42 +0300)
committerEli Zaretskii <eliz@gnu.org>
Fri, 8 Jul 2022 06:42:02 +0000 (09:42 +0300)
* 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

index 7821c120ca0cfe66f8965cb50abe3a340cc029a2..0b88b434bc237c5079c2753b8e3bde857cde20ca 100644 (file)
@@ -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)