[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master b9be4c1 4/6: Fix scrolling with partial lines
From: |
Noam Postavsky |
Subject: |
[Emacs-diffs] master b9be4c1 4/6: Fix scrolling with partial lines |
Date: |
Fri, 3 Feb 2017 02:38:33 +0000 (UTC) |
branch: master
commit b9be4c14e89f5cec08a7a0f0d24033e0e6ff5ef0
Author: Noam Postavsky <address@hidden>
Commit: Noam Postavsky <address@hidden>
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.
---
src/dispextern.h | 1 +
src/window.c | 2 +-
src/xdisp.c | 29 ++++++++++++++++++++++++++++-
3 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/src/dispextern.h b/src/dispextern.h
index 51222e6..eb71a82 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -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;
diff --git a/src/window.c b/src/window.c
index ba03780..9569044 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)
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);
diff --git a/src/xdisp.c b/src/xdisp.c
index 134ef6c..0e329df 100644
--- a/src/xdisp.c
+++ b/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));
- [Emacs-diffs] master updated (604724e -> ce88155), Noam Postavsky, 2017/02/02
- [Emacs-diffs] master c92fc7a 2/6: Don't count mode line for scroll-margin limit, Noam Postavsky, 2017/02/02
- [Emacs-diffs] master da515a0 5/6: Add tests for scrolling, Noam Postavsky, 2017/02/02
- [Emacs-diffs] master d17e92d 1/6: Refactor uses of scroll_margin to a function, Noam Postavsky, 2017/02/02
- [Emacs-diffs] master b9be4c1 4/6: Fix scrolling with partial lines,
Noam Postavsky <=
- [Emacs-diffs] master e27a91c 3/6: Make limit on scroll-margin variable, Noam Postavsky, 2017/02/02
- [Emacs-diffs] master ce88155 6/6: ; Merge: fixes and updates to scroll margin (Bug#5718), Noam Postavsky, 2017/02/02