summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2014-11-15 19:04:17 +0200
committerEli Zaretskii <eliz@gnu.org>2014-11-15 19:04:17 +0200
commit1fb97e79d269d8196811ebb6abdd93d70c95bc5c (patch)
tree78607add4b5dc0efc79ba4d3c0a76b2c939c802f
parentd4fceca9cd0d6f42bd45f4c6e572d1335c9d40dc (diff)
downloademacs-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/ChangeLog6
-rw-r--r--src/window.c17
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