emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 9c12c3b7c5: Improve narrowing when iterator has moved outside of


From: Gregory Heytings
Subject: master 9c12c3b7c5: Improve narrowing when iterator has moved outside of narrowing bounds.
Date: Fri, 29 Jul 2022 12:29:15 -0400 (EDT)

branch: master
commit 9c12c3b7c59ee102d3a022368ea050fc9e3bb186
Author: Gregory Heytings <gregory@heytings.org>
Commit: Gregory Heytings <gregory@heytings.org>

    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'.
---
 src/composite.c  |  2 +-
 src/dispextern.h |  4 ++--
 src/xdisp.c      | 26 +++++++++++++++++---------
 3 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/src/composite.c b/src/composite.c
index b04d34337b..0f90b92a78 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,
        head = backlim;
       /* In buffers with very long lines, this function becomes very
         slow.  Pretend that the buffer is narrowed to make it fast.  */
-      narrowed_begv = get_narrowed_begv (w);
+      narrowed_begv = get_narrowed_begv (w, window_point (w));
       if (narrowed_begv && pos > narrowed_begv)
        head = narrowed_begv;
       tail = ZV;
diff --git a/src/dispextern.h b/src/dispextern.h
index 2772e8cda8..817211e795 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -3404,8 +3404,8 @@ void mark_window_display_accurate (Lisp_Object, bool);
 void redisplay_preserve_echo_area (int);
 void init_iterator (struct it *, struct window *, ptrdiff_t,
                     ptrdiff_t, struct glyph_row *, enum face_id);
-ptrdiff_t get_narrowed_begv (struct window *);
-ptrdiff_t get_narrowed_zv (struct window *);
+ptrdiff_t get_narrowed_begv (struct window *, ptrdiff_t);
+ptrdiff_t get_narrowed_zv (struct window *, ptrdiff_t);
 ptrdiff_t get_closer_narrowed_begv (struct window *, ptrdiff_t);
 void init_iterator_to_row_start (struct it *, struct window *,
                                  struct glyph_row *);
diff --git a/src/xdisp.c b/src/xdisp.c
index 9580e59601..cdef90b686 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -3427,8 +3427,8 @@ init_iterator (struct it *it, struct window *w,
 
   if (current_buffer->long_line_optimizations_p)
     {
-      it->narrowed_begv = get_narrowed_begv (w);
-      it->narrowed_zv = get_narrowed_zv (w);
+      it->narrowed_begv = get_narrowed_begv (w, window_point (w));
+      it->narrowed_zv = get_narrowed_zv (w, window_point (w));
     }
 
   /* If a buffer position was specified, set the iterator there,
@@ -3519,19 +3519,19 @@ get_narrowed_len (struct window *w)
 }
 
 ptrdiff_t
-get_narrowed_begv (struct window *w)
+get_narrowed_begv (struct window *w, ptrdiff_t pos)
 {
   int len = get_narrowed_len (w);
   ptrdiff_t begv;
-  begv = max ((window_point (w) / len - 1) * len, BEGV);
+  begv = max ((pos / len - 1) * len, BEGV);
   return begv == BEGV ? 0 : begv;
 }
 
 ptrdiff_t
-get_narrowed_zv (struct window *w)
+get_narrowed_zv (struct window *w, ptrdiff_t pos)
 {
   int len = get_narrowed_len (w);
-  return min ((window_point (w) / len + 1) * len, ZV);
+  return min ((pos / len + 1) * len, ZV);
 }
 
 ptrdiff_t
@@ -4408,9 +4408,17 @@ handle_fontified_prop (struct it *it)
       eassert (it->end_charpos == ZV);
 
       if (current_buffer->long_line_optimizations_p)
-       Fnarrow_to_region (make_fixnum (it->narrowed_begv ?
-                                       it->narrowed_begv : BEGV),
-                          make_fixnum (it->narrowed_zv), Qt);
+       {
+         ptrdiff_t begv = it->narrowed_begv ? it->narrowed_begv : BEGV;
+         ptrdiff_t zv = it->narrowed_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);
+           }
+         Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv), Qt);
+       }
 
       /* Don't allow Lisp that runs from 'fontification-functions'
         clear our face and image caches behind our back.  */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]