diff options
| author | Noam Postavsky | 2017-01-21 13:24:47 -0500 |
|---|---|---|
| committer | Noam Postavsky | 2017-02-02 21:21:18 -0500 |
| commit | b9be4c14e89f5cec08a7a0f0d24033e0e6ff5ef0 (patch) | |
| tree | ba9f3ce95ecfc4f303a06f8e95a28c6cc9125eef /src | |
| parent | e27a91cddc1a66c25e09d3929c5625637ec34a49 (diff) | |
| download | emacs-b9be4c14e89f5cec08a7a0f0d24033e0e6ff5ef0.tar.gz emacs-b9be4c14e89f5cec08a7a0f0d24033e0e6ff5ef0.zip | |
Fix scrolling with partial lines
* src/xdisp.c (partial_line_height): New function.
(try_scrolling):
* src/window.c (window_scroll_pixel_based): Use it for calculating the
pixel scroll margin correctly in a window with partial lines.
Diffstat (limited to 'src')
| -rw-r--r-- | src/dispextern.h | 1 | ||||
| -rw-r--r-- | src/window.c | 2 | ||||
| -rw-r--r-- | src/xdisp.c | 29 |
3 files changed, 30 insertions, 2 deletions
diff --git a/src/dispextern.h b/src/dispextern.h index 51222e636be..eb71a82311c 100644 --- a/src/dispextern.h +++ b/src/dispextern.h | |||
| @@ -3263,6 +3263,7 @@ void move_it_past_eol (struct it *); | |||
| 3263 | void move_it_in_display_line (struct it *it, | 3263 | void move_it_in_display_line (struct it *it, |
| 3264 | ptrdiff_t to_charpos, int to_x, | 3264 | ptrdiff_t to_charpos, int to_x, |
| 3265 | enum move_operation_enum op); | 3265 | enum move_operation_enum op); |
| 3266 | int partial_line_height (struct it *it_origin); | ||
| 3266 | bool in_display_vector_p (struct it *); | 3267 | bool in_display_vector_p (struct it *); |
| 3267 | int frame_mode_line_height (struct frame *); | 3268 | int frame_mode_line_height (struct frame *); |
| 3268 | extern bool redisplaying_p; | 3269 | extern bool redisplaying_p; |
diff --git a/src/window.c b/src/window.c index ba03780f3df..95690443f8e 100644 --- a/src/window.c +++ b/src/window.c | |||
| @@ -5147,7 +5147,7 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, bool noerror) | |||
| 5147 | in the scroll margin at the bottom. */ | 5147 | in the scroll margin at the bottom. */ |
| 5148 | move_it_to (&it, PT, -1, | 5148 | move_it_to (&it, PT, -1, |
| 5149 | (it.last_visible_y - WINDOW_HEADER_LINE_HEIGHT (w) | 5149 | (it.last_visible_y - WINDOW_HEADER_LINE_HEIGHT (w) |
| 5150 | - this_scroll_margin - 1), | 5150 | - partial_line_height (&it) - this_scroll_margin - 1), |
| 5151 | -1, | 5151 | -1, |
| 5152 | MOVE_TO_POS | MOVE_TO_Y); | 5152 | MOVE_TO_POS | MOVE_TO_Y); |
| 5153 | 5153 | ||
diff --git a/src/xdisp.c b/src/xdisp.c index 134ef6c6196..0e329dfe6e9 100644 --- a/src/xdisp.c +++ b/src/xdisp.c | |||
| @@ -9859,6 +9859,32 @@ move_it_by_lines (struct it *it, ptrdiff_t dvpos) | |||
| 9859 | } | 9859 | } |
| 9860 | } | 9860 | } |
| 9861 | 9861 | ||
| 9862 | int | ||
| 9863 | partial_line_height (struct it *it_origin) | ||
| 9864 | { | ||
| 9865 | int partial_height; | ||
| 9866 | void *it_data = NULL; | ||
| 9867 | struct it it; | ||
| 9868 | SAVE_IT (it, *it_origin, it_data); | ||
| 9869 | move_it_to (&it, ZV, -1, it.last_visible_y, -1, | ||
| 9870 | MOVE_TO_POS | MOVE_TO_Y); | ||
| 9871 | if (it.what == IT_EOB) | ||
| 9872 | { | ||
| 9873 | int vis_height = it.last_visible_y - it.current_y; | ||
| 9874 | int height = it.ascent + it.descent; | ||
| 9875 | partial_height = (vis_height < height) ? vis_height : 0; | ||
| 9876 | } | ||
| 9877 | else | ||
| 9878 | { | ||
| 9879 | int last_line_y = it.current_y; | ||
| 9880 | move_it_by_lines (&it, 1); | ||
| 9881 | partial_height = (it.current_y > it.last_visible_y) | ||
| 9882 | ? it.last_visible_y - last_line_y : 0; | ||
| 9883 | } | ||
| 9884 | RESTORE_IT (&it, &it, it_data); | ||
| 9885 | return partial_height; | ||
| 9886 | } | ||
| 9887 | |||
| 9862 | /* Return true if IT points into the middle of a display vector. */ | 9888 | /* Return true if IT points into the middle of a display vector. */ |
| 9863 | 9889 | ||
| 9864 | bool | 9890 | bool |
| @@ -15368,7 +15394,8 @@ try_scrolling (Lisp_Object window, bool just_this_one_p, | |||
| 15368 | /* Compute the pixel ypos of the scroll margin, then move IT to | 15394 | /* Compute the pixel ypos of the scroll margin, then move IT to |
| 15369 | either that ypos or PT, whichever comes first. */ | 15395 | either that ypos or PT, whichever comes first. */ |
| 15370 | start_display (&it, w, startp); | 15396 | start_display (&it, w, startp); |
| 15371 | scroll_margin_y = it.last_visible_y - this_scroll_margin | 15397 | scroll_margin_y = it.last_visible_y - partial_line_height (&it) |
| 15398 | - this_scroll_margin | ||
| 15372 | - frame_line_height * extra_scroll_margin_lines; | 15399 | - frame_line_height * extra_scroll_margin_lines; |
| 15373 | move_it_to (&it, PT, -1, scroll_margin_y - 1, -1, | 15400 | move_it_to (&it, PT, -1, scroll_margin_y - 1, -1, |
| 15374 | (MOVE_TO_POS | MOVE_TO_Y)); | 15401 | (MOVE_TO_POS | MOVE_TO_Y)); |