aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEli Zaretskii2016-09-05 19:57:22 +0300
committerEli Zaretskii2016-09-05 19:57:22 +0300
commit6acff25280dbb97b5e9ddfd872b33ceb36b0470a (patch)
tree24b7152457c11d14aefdf8952ce7d3500586be05 /src
parentcfaf18a27c262694750400005e882f1cfc7ff2b0 (diff)
downloademacs-6acff25280dbb97b5e9ddfd872b33ceb36b0470a.tar.gz
emacs-6acff25280dbb97b5e9ddfd872b33ceb36b0470a.zip
Avoid assertion violations when scrolling narrowed buffer
* src/window.c (window_scroll_pixel_based): * src/xdisp.c (pos_visible_p): Don't allow simulated redisplay to start outside the accessible portion of the buffer. This avoids assertion violations when some Lisp narrows the buffer to less than the current window, and then attempts to scroll the buffer.
Diffstat (limited to 'src')
-rw-r--r--src/window.c5
-rw-r--r--src/xdisp.c5
2 files changed, 6 insertions, 4 deletions
diff --git a/src/window.c b/src/window.c
index 374ef0f838f..753ebc16fbf 100644
--- a/src/window.c
+++ b/src/window.c
@@ -4813,8 +4813,9 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, bool noerror)
4813 SET_TEXT_POS_FROM_MARKER (start, w->start); 4813 SET_TEXT_POS_FROM_MARKER (start, w->start);
4814 /* Scrolling a minibuffer window via scroll bar when the echo area 4814 /* Scrolling a minibuffer window via scroll bar when the echo area
4815 shows long text sometimes resets the minibuffer contents behind 4815 shows long text sometimes resets the minibuffer contents behind
4816 our backs. */ 4816 our backs. Also, someone might narrow-to-region and immediately
4817 if (CHARPOS (start) > ZV) 4817 call a scroll function. */
4818 if (CHARPOS (start) > ZV || CHARPOS (start) < BEGV)
4818 SET_TEXT_POS (start, BEGV, BEGV_BYTE); 4819 SET_TEXT_POS (start, BEGV, BEGV_BYTE);
4819 4820
4820 /* If PT is not visible in WINDOW, move back one half of 4821 /* If PT is not visible in WINDOW, move back one half of
diff --git a/src/xdisp.c b/src/xdisp.c
index dc68cd48e5f..d1e884820b6 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -1317,8 +1317,9 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int *x, int *y,
1317 SET_TEXT_POS_FROM_MARKER (top, w->start); 1317 SET_TEXT_POS_FROM_MARKER (top, w->start);
1318 /* Scrolling a minibuffer window via scroll bar when the echo area 1318 /* Scrolling a minibuffer window via scroll bar when the echo area
1319 shows long text sometimes resets the minibuffer contents behind 1319 shows long text sometimes resets the minibuffer contents behind
1320 our backs. */ 1320 our backs. Also, someone might narrow-to-region and immediately
1321 if (CHARPOS (top) > ZV) 1321 call a scroll function. */
1322 if (CHARPOS (top) > ZV || CHARPOS (top) < BEGV)
1322 SET_TEXT_POS (top, BEGV, BEGV_BYTE); 1323 SET_TEXT_POS (top, BEGV, BEGV_BYTE);
1323 1324
1324 /* If the top of the window is after CHARPOS, the latter is surely 1325 /* If the top of the window is after CHARPOS, the latter is surely