diff options
author | Eli Zaretskii <eliz@gnu.org> | 2014-11-15 19:04:17 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2014-11-15 19:04:17 +0200 |
commit | 1fb97e79d269d8196811ebb6abdd93d70c95bc5c (patch) | |
tree | 78607add4b5dc0efc79ba4d3c0a76b2c939c802f | |
parent | d4fceca9cd0d6f42bd45f4c6e572d1335c9d40dc (diff) | |
download | emacs-1fb97e79d269d8196811ebb6abdd93d70c95bc5c.tar.gz emacs-1fb97e79d269d8196811ebb6abdd93d70c95bc5c.tar.bz2 emacs-1fb97e79d269d8196811ebb6abdd93d70c95bc5c.zip |
Fix bug #19060 with inaccurate pixel-based scrolling.
src/window.c (window_scroll_pixel_based): Avoid truncation/rounding
errors in computing the number of pixels to scroll. Suggested by
Kelly Dean <kelly@prtime.org>.
-rw-r--r-- | src/ChangeLog | 6 | ||||
-rw-r--r-- | src/window.c | 17 |
2 files changed, 19 insertions, 4 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index b431dd255a9..2ea5d29d3b2 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2014-11-15 Eli Zaretskii <eliz@gnu.org> + + * window.c (window_scroll_pixel_based): Avoid truncation/rounding + errors in computing the number of pixels to scroll. Suggested by + Kelly Dean <kelly@prtime.org>. (Bug#19060) + 2014-11-15 Jan Djärv <jan.h.d@swipnet.se> * nsmenu.m (update_frame_tool_bar): If tool bar changes height, diff --git a/src/window.c b/src/window.c index b00242311a6..6938ffb8cb8 100644 --- a/src/window.c +++ b/src/window.c @@ -4955,9 +4955,14 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, int noerror) { int px; int dy = frame_line_height; + /* In the below we divide the window box height by the + frame's line height to make the result predictable when + the window box is not an integral multiple of the line + height. This is important to ensure we get back to the + same position when scrolling up, then down. */ if (whole) - dy = max ((window_box_height (w) - - next_screen_context_lines * dy), + dy = max ((window_box_height (w) / dy + - next_screen_context_lines) * dy, dy); dy *= n; @@ -5039,8 +5044,12 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, int noerror) { ptrdiff_t start_pos = IT_CHARPOS (it); int dy = frame_line_height; - dy = max ((window_box_height (w) - - next_screen_context_lines * dy), + /* In the below we divide the window box height by the frame's + line height to make the result predictable when the window + box is not an integral multiple of the line height. This is + important to ensure we get back to the same position when + scrolling up, then down. */ + dy = max ((window_box_height (w) / dy - next_screen_context_lines) * dy, dy) * n; /* Note that move_it_vertically always moves the iterator to the |