aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGregory Heytings2022-07-29 16:23:16 +0000
committerGregory Heytings2022-07-29 18:28:44 +0200
commit9c12c3b7c59ee102d3a022368ea050fc9e3bb186 (patch)
tree9cb7ef34bf3c274f38a9960b6ff62a7694fe629f /src
parent006f621a89ca327ff0ca0287e14ae9fd432309e1 (diff)
downloademacs-9c12c3b7c59ee102d3a022368ea050fc9e3bb186.tar.gz
emacs-9c12c3b7c59ee102d3a022368ea050fc9e3bb186.zip
Improve narrowing when iterator has moved outside of narrowing bounds.
* src/xdisp.c (get_narrowed_begv, get_narrowed_zv): Add 'pos' parameter. (init_iterator): Add arguments to 'get_narrowed_begv' and 'get_narrowed_zv'. (handle_fontified_prop): Recompute the narrowing when iterator has moved outside of narrowing bounds. * src/dispextern.h (get_narrowed_begv, get_narrowed_zv): Adapt prototypes. * src/composite.c (find_automatic_composition): Add argument to 'get_narrowed_begv'.
Diffstat (limited to 'src')
-rw-r--r--src/composite.c2
-rw-r--r--src/dispextern.h4
-rw-r--r--src/xdisp.c26
3 files changed, 20 insertions, 12 deletions
diff --git a/src/composite.c b/src/composite.c
index b04d34337b4..0f90b92a785 100644
--- a/src/composite.c
+++ b/src/composite.c
@@ -1599,7 +1599,7 @@ find_automatic_composition (ptrdiff_t pos, ptrdiff_t limit, ptrdiff_t backlim,
1599 head = backlim; 1599 head = backlim;
1600 /* In buffers with very long lines, this function becomes very 1600 /* In buffers with very long lines, this function becomes very
1601 slow. Pretend that the buffer is narrowed to make it fast. */ 1601 slow. Pretend that the buffer is narrowed to make it fast. */
1602 narrowed_begv = get_narrowed_begv (w); 1602 narrowed_begv = get_narrowed_begv (w, window_point (w));
1603 if (narrowed_begv && pos > narrowed_begv) 1603 if (narrowed_begv && pos > narrowed_begv)
1604 head = narrowed_begv; 1604 head = narrowed_begv;
1605 tail = ZV; 1605 tail = ZV;
diff --git a/src/dispextern.h b/src/dispextern.h
index 2772e8cda8d..817211e795e 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -3404,8 +3404,8 @@ void mark_window_display_accurate (Lisp_Object, bool);
3404void redisplay_preserve_echo_area (int); 3404void redisplay_preserve_echo_area (int);
3405void init_iterator (struct it *, struct window *, ptrdiff_t, 3405void init_iterator (struct it *, struct window *, ptrdiff_t,
3406 ptrdiff_t, struct glyph_row *, enum face_id); 3406 ptrdiff_t, struct glyph_row *, enum face_id);
3407ptrdiff_t get_narrowed_begv (struct window *); 3407ptrdiff_t get_narrowed_begv (struct window *, ptrdiff_t);
3408ptrdiff_t get_narrowed_zv (struct window *); 3408ptrdiff_t get_narrowed_zv (struct window *, ptrdiff_t);
3409ptrdiff_t get_closer_narrowed_begv (struct window *, ptrdiff_t); 3409ptrdiff_t get_closer_narrowed_begv (struct window *, ptrdiff_t);
3410void init_iterator_to_row_start (struct it *, struct window *, 3410void init_iterator_to_row_start (struct it *, struct window *,
3411 struct glyph_row *); 3411 struct glyph_row *);
diff --git a/src/xdisp.c b/src/xdisp.c
index 9580e596012..cdef90b6868 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -3427,8 +3427,8 @@ init_iterator (struct it *it, struct window *w,
3427 3427
3428 if (current_buffer->long_line_optimizations_p) 3428 if (current_buffer->long_line_optimizations_p)
3429 { 3429 {
3430 it->narrowed_begv = get_narrowed_begv (w); 3430 it->narrowed_begv = get_narrowed_begv (w, window_point (w));
3431 it->narrowed_zv = get_narrowed_zv (w); 3431 it->narrowed_zv = get_narrowed_zv (w, window_point (w));
3432 } 3432 }
3433 3433
3434 /* If a buffer position was specified, set the iterator there, 3434 /* If a buffer position was specified, set the iterator there,
@@ -3519,19 +3519,19 @@ get_narrowed_len (struct window *w)
3519} 3519}
3520 3520
3521ptrdiff_t 3521ptrdiff_t
3522get_narrowed_begv (struct window *w) 3522get_narrowed_begv (struct window *w, ptrdiff_t pos)
3523{ 3523{
3524 int len = get_narrowed_len (w); 3524 int len = get_narrowed_len (w);
3525 ptrdiff_t begv; 3525 ptrdiff_t begv;
3526 begv = max ((window_point (w) / len - 1) * len, BEGV); 3526 begv = max ((pos / len - 1) * len, BEGV);
3527 return begv == BEGV ? 0 : begv; 3527 return begv == BEGV ? 0 : begv;
3528} 3528}
3529 3529
3530ptrdiff_t 3530ptrdiff_t
3531get_narrowed_zv (struct window *w) 3531get_narrowed_zv (struct window *w, ptrdiff_t pos)
3532{ 3532{
3533 int len = get_narrowed_len (w); 3533 int len = get_narrowed_len (w);
3534 return min ((window_point (w) / len + 1) * len, ZV); 3534 return min ((pos / len + 1) * len, ZV);
3535} 3535}
3536 3536
3537ptrdiff_t 3537ptrdiff_t
@@ -4408,9 +4408,17 @@ handle_fontified_prop (struct it *it)
4408 eassert (it->end_charpos == ZV); 4408 eassert (it->end_charpos == ZV);
4409 4409
4410 if (current_buffer->long_line_optimizations_p) 4410 if (current_buffer->long_line_optimizations_p)
4411 Fnarrow_to_region (make_fixnum (it->narrowed_begv ? 4411 {
4412 it->narrowed_begv : BEGV), 4412 ptrdiff_t begv = it->narrowed_begv ? it->narrowed_begv : BEGV;
4413 make_fixnum (it->narrowed_zv), Qt); 4413 ptrdiff_t zv = it->narrowed_zv;
4414 ptrdiff_t charpos = IT_CHARPOS (*it);
4415 if (charpos < begv || charpos > zv)
4416 {
4417 begv = get_narrowed_begv (it->w, charpos);
4418 zv = get_narrowed_zv (it->w, charpos);
4419 }
4420 Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv), Qt);
4421 }
4414 4422
4415 /* Don't allow Lisp that runs from 'fontification-functions' 4423 /* Don't allow Lisp that runs from 'fontification-functions'
4416 clear our face and image caches behind our back. */ 4424 clear our face and image caches behind our back. */