diff options
| author | Gregory Heytings | 2022-07-29 16:23:16 +0000 |
|---|---|---|
| committer | Gregory Heytings | 2022-07-29 18:28:44 +0200 |
| commit | 9c12c3b7c59ee102d3a022368ea050fc9e3bb186 (patch) | |
| tree | 9cb7ef34bf3c274f38a9960b6ff62a7694fe629f /src | |
| parent | 006f621a89ca327ff0ca0287e14ae9fd432309e1 (diff) | |
| download | emacs-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.c | 2 | ||||
| -rw-r--r-- | src/dispextern.h | 4 | ||||
| -rw-r--r-- | src/xdisp.c | 26 |
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); | |||
| 3404 | void redisplay_preserve_echo_area (int); | 3404 | void redisplay_preserve_echo_area (int); |
| 3405 | void init_iterator (struct it *, struct window *, ptrdiff_t, | 3405 | void 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); |
| 3407 | ptrdiff_t get_narrowed_begv (struct window *); | 3407 | ptrdiff_t get_narrowed_begv (struct window *, ptrdiff_t); |
| 3408 | ptrdiff_t get_narrowed_zv (struct window *); | 3408 | ptrdiff_t get_narrowed_zv (struct window *, ptrdiff_t); |
| 3409 | ptrdiff_t get_closer_narrowed_begv (struct window *, ptrdiff_t); | 3409 | ptrdiff_t get_closer_narrowed_begv (struct window *, ptrdiff_t); |
| 3410 | void init_iterator_to_row_start (struct it *, struct window *, | 3410 | void 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 | ||
| 3521 | ptrdiff_t | 3521 | ptrdiff_t |
| 3522 | get_narrowed_begv (struct window *w) | 3522 | get_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 | ||
| 3530 | ptrdiff_t | 3530 | ptrdiff_t |
| 3531 | get_narrowed_zv (struct window *w) | 3531 | get_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 | ||
| 3537 | ptrdiff_t | 3537 | ptrdiff_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. */ |