summaryrefslogtreecommitdiff
path: root/src/xdisp.c
diff options
context:
space:
mode:
authorGregory Heytings <gregory@heytings.org>2022-11-26 14:09:41 +0000
committerGregory Heytings <gregory@heytings.org>2022-11-26 15:10:17 +0100
commit558084c7f736bebcb3cffc2bf4f617158d92357f (patch)
tree5e05c5a457fe09073321b6b6543f1bbc00e766ed /src/xdisp.c
parent16b8b0d1e07d394e01f76d9eed6006219b4d745b (diff)
downloademacs-558084c7f736bebcb3cffc2bf4f617158d92357f.tar.gz
Improve locked narrowing around low-level hooks.
* src/buffer.c (syms_of_buffer): Two new variables, 'long-line-locked-narrowing-region-size' and 'long-line-locked-narrowing-bol-search-limit', to make the locked narrowing around low-level hooks configurable. Increase the default value of 'long-line-threshold'. After carefully considering the (few) bug reports about long line optimizations, I concluded that the previous default value was too low. * src/xdisp.c (get_locked_narrowing_begv) (get_locked_narrowing_zv): Two new functions. (handle_fontified_prop, reseat): Use them. * src/keyboard.c (safe_run_hooks_maybe_narrowed): Use them. * src/dispextern.h (struct it): Add two new fields to store the values returned by these functions. Make them externally visible. * src/editfns.c: (Fsave_restriction): Update docstring.
Diffstat (limited to 'src/xdisp.c')
-rw-r--r--src/xdisp.c44
1 files changed, 40 insertions, 4 deletions
diff --git a/src/xdisp.c b/src/xdisp.c
index 658ce57b7ea..430201874c3 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -3533,6 +3533,34 @@ get_closer_narrowed_begv (struct window *w, ptrdiff_t pos)
return max ((pos / len - 1) * len, BEGV);
}
+ptrdiff_t
+get_locked_narrowing_begv (ptrdiff_t pos)
+{
+ if (long_line_locked_narrowing_region_size == 0)
+ return BEGV;
+ int begv;
+ int len = long_line_locked_narrowing_region_size / 2;
+ begv = max (pos - len, BEGV);
+ int limit = long_line_locked_narrowing_bol_search_limit;
+ while (limit)
+ {
+ if (begv == BEGV || FETCH_BYTE (CHAR_TO_BYTE (begv) - 1) == '\n')
+ return begv;
+ begv--;
+ limit--;
+ }
+ return begv;
+}
+
+ptrdiff_t
+get_locked_narrowing_zv (ptrdiff_t pos)
+{
+ if (long_line_locked_narrowing_region_size == 0)
+ return ZV;
+ int len = long_line_locked_narrowing_region_size / 2;
+ return min (pos + len, ZV);
+}
+
static void
unwind_narrowed_begv (Lisp_Object point_min)
{
@@ -4368,13 +4396,13 @@ handle_fontified_prop (struct it *it)
if (current_buffer->long_line_optimizations_p)
{
- ptrdiff_t begv = it->narrowed_begv;
- ptrdiff_t zv = it->narrowed_zv;
+ ptrdiff_t begv = it->locked_narrowing_begv;
+ ptrdiff_t zv = it->locked_narrowing_zv;
ptrdiff_t charpos = IT_CHARPOS (*it);
if (charpos < begv || charpos > zv)
{
- begv = get_narrowed_begv (it->w, charpos);
- zv = get_narrowed_zv (it->w, charpos);
+ begv = get_locked_narrowing_begv (charpos);
+ zv = get_locked_narrowing_zv (charpos);
}
narrow_to_region_locked (make_fixnum (begv), make_fixnum (zv),
Qfontification_functions);
@@ -7435,12 +7463,20 @@ reseat (struct it *it, struct text_pos pos, bool force_p)
{
it->narrowed_begv = get_narrowed_begv (it->w, window_point (it->w));
it->narrowed_zv = get_narrowed_zv (it->w, window_point (it->w));
+ it->locked_narrowing_begv
+ = get_locked_narrowing_begv (window_point (it->w));
+ it->locked_narrowing_zv
+ = get_locked_narrowing_zv (window_point (it->w));
}
else if ((pos.charpos < it->narrowed_begv || pos.charpos > it->narrowed_zv)
&& (!redisplaying_p || it->line_wrap == TRUNCATE))
{
it->narrowed_begv = get_narrowed_begv (it->w, pos.charpos);
it->narrowed_zv = get_narrowed_zv (it->w, pos.charpos);
+ it->locked_narrowing_begv
+ = get_locked_narrowing_begv (window_point (it->w));
+ it->locked_narrowing_zv
+ = get_locked_narrowing_zv (window_point (it->w));
}
}