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.
This commit is contained in:
parent
e27a91cddc
commit
b9be4c14e8
3 changed files with 30 additions and 2 deletions
|
@ -3263,6 +3263,7 @@ void move_it_past_eol (struct it *);
|
|||
void move_it_in_display_line (struct it *it,
|
||||
ptrdiff_t to_charpos, int to_x,
|
||||
enum move_operation_enum op);
|
||||
int partial_line_height (struct it *it_origin);
|
||||
bool in_display_vector_p (struct it *);
|
||||
int frame_mode_line_height (struct frame *);
|
||||
extern bool redisplaying_p;
|
||||
|
|
|
@ -5147,7 +5147,7 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, bool noerror)
|
|||
in the scroll margin at the bottom. */
|
||||
move_it_to (&it, PT, -1,
|
||||
(it.last_visible_y - WINDOW_HEADER_LINE_HEIGHT (w)
|
||||
- this_scroll_margin - 1),
|
||||
- partial_line_height (&it) - this_scroll_margin - 1),
|
||||
-1,
|
||||
MOVE_TO_POS | MOVE_TO_Y);
|
||||
|
||||
|
|
29
src/xdisp.c
29
src/xdisp.c
|
@ -9859,6 +9859,32 @@ move_it_by_lines (struct it *it, ptrdiff_t dvpos)
|
|||
}
|
||||
}
|
||||
|
||||
int
|
||||
partial_line_height (struct it *it_origin)
|
||||
{
|
||||
int partial_height;
|
||||
void *it_data = NULL;
|
||||
struct it it;
|
||||
SAVE_IT (it, *it_origin, it_data);
|
||||
move_it_to (&it, ZV, -1, it.last_visible_y, -1,
|
||||
MOVE_TO_POS | MOVE_TO_Y);
|
||||
if (it.what == IT_EOB)
|
||||
{
|
||||
int vis_height = it.last_visible_y - it.current_y;
|
||||
int height = it.ascent + it.descent;
|
||||
partial_height = (vis_height < height) ? vis_height : 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
int last_line_y = it.current_y;
|
||||
move_it_by_lines (&it, 1);
|
||||
partial_height = (it.current_y > it.last_visible_y)
|
||||
? it.last_visible_y - last_line_y : 0;
|
||||
}
|
||||
RESTORE_IT (&it, &it, it_data);
|
||||
return partial_height;
|
||||
}
|
||||
|
||||
/* Return true if IT points into the middle of a display vector. */
|
||||
|
||||
bool
|
||||
|
@ -15368,7 +15394,8 @@ try_scrolling (Lisp_Object window, bool just_this_one_p,
|
|||
/* Compute the pixel ypos of the scroll margin, then move IT to
|
||||
either that ypos or PT, whichever comes first. */
|
||||
start_display (&it, w, startp);
|
||||
scroll_margin_y = it.last_visible_y - this_scroll_margin
|
||||
scroll_margin_y = it.last_visible_y - partial_line_height (&it)
|
||||
- this_scroll_margin
|
||||
- frame_line_height * extra_scroll_margin_lines;
|
||||
move_it_to (&it, PT, -1, scroll_margin_y - 1, -1,
|
||||
(MOVE_TO_POS | MOVE_TO_Y));
|
||||
|
|
Loading…
Add table
Reference in a new issue