]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix cursor motion slowdown at the beginning of buffer.
authorEli Zaretskii <eliz@gnu.org>
Sun, 24 Jul 2011 18:19:10 +0000 (21:19 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sun, 24 Jul 2011 18:19:10 +0000 (21:19 +0300)
 src/xdisp.c (compute_display_string_pos): Fix logic of caching
 previous display string position.  Initialize cached_prev_pos to -1.

src/ChangeLog
src/xdisp.c

index dd5a1fba871d27cbf1d94e6bf15a8cc44ba4dc9e..8aa1237f6931748be5a7e96170bd9cf3a47a524b 100644 (file)
@@ -1,3 +1,9 @@
+2011-07-24  Eli Zaretskii  <eliz@gnu.org>
+
+       * xdisp.c (compute_display_string_pos): Fix logic of caching
+       previous display string position.  Initialize cached_prev_pos to
+       -1.  Fixes slow-down at the beginning of a buffer.
+
 2011-07-23  Eli Zaretskii  <eliz@gnu.org>
 
        * xdisp.c (move_it_in_display_line_to): Record the best matching
index a5eb2aa923ab3efa2b1a6a851d990de3686efa09..5f9e80cd11e63cf012a019c4e0e76382dc247659 100644 (file)
@@ -3140,7 +3140,7 @@ next_overlay_change (EMACS_INT pos)
 /* Record one cached display string position found recently by
    compute_display_string_pos.  */
 static EMACS_INT cached_disp_pos;
-static EMACS_INT cached_prev_pos;
+static EMACS_INT cached_prev_pos = -1;
 static struct buffer *cached_disp_buffer;
 static int cached_disp_modiff;
 static int cached_disp_overlay_modiff;
@@ -3190,18 +3190,22 @@ compute_display_string_pos (struct text_pos *position,
          && BUF_MODIFF (b) == cached_disp_modiff
          && BUF_OVERLAY_MODIFF (b) == cached_disp_overlay_modiff)
        {
-         if (cached_prev_pos
+         if (cached_prev_pos >= 0
              && cached_prev_pos < charpos && charpos <= cached_disp_pos)
            return cached_disp_pos;
          /* Handle overstepping either end of the known interval.  */
          if (charpos > cached_disp_pos)
            cached_prev_pos = cached_disp_pos;
          else  /* charpos <= cached_prev_pos */
-           cached_prev_pos = max (charpos - 1, BEGV);
+           cached_prev_pos = max (charpos - 1, 0);
        }
 
       /* Record new values in the cache.  */
-      cached_disp_buffer = b;
+      if (b != cached_disp_buffer)
+       {
+         cached_disp_buffer = b;
+         cached_prev_pos = max (charpos - 1, 0);
+       }
       cached_disp_modiff = BUF_MODIFF (b);
       cached_disp_overlay_modiff = BUF_OVERLAY_MODIFF (b);
     }