]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix subtle problems with linum-mode and invisible text
authorEli Zaretskii <eliz@gnu.org>
Sun, 15 Mar 2015 17:17:46 +0000 (19:17 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sun, 15 Mar 2015 17:17:46 +0000 (19:17 +0200)
 src/xdisp.c (handle_invisible_prop): Fix up it->position even when
 we are going to load overlays at the beginning of the invisible
 text.
 (setup_for_ellipsis): Reset the ignore_overlay_strings_at_pos_p
 flag also here.
 (next_overlay_string): Set the overlay_strings_at_end_processed_p
 flag only if the overlays just processed were actually loaded at
 EOB.

src/ChangeLog
src/xdisp.c

index cb4aad6ec95ef68dd622bbb7d8124c86c54e76c9..e328afcde8f19bb38453e72e4030e5455119716a 100644 (file)
@@ -1,3 +1,14 @@
+2015-03-15  Eli Zaretskii  <eliz@gnu.org>
+
+       * xdisp.c (handle_invisible_prop): Fix up it->position even when
+       we are going to load overlays at the beginning of the invisible
+       text.
+       (setup_for_ellipsis): Reset the ignore_overlay_strings_at_pos_p
+       flag also here.
+       (next_overlay_string): Set the overlay_strings_at_end_processed_p
+       flag only if the overlays just processed were actually loaded at
+       EOB.
+
 2015-03-14  Daniel Colascione  <dancol@dancol.org>
 
        * emacs.c (standard_args): Add --no-x-resources.
index ce685fd6e226c40e4fc9a03a6e7fc0527de991d8..a17f5a9c34f6f372615a79653710fbe232373545 100644 (file)
@@ -4412,6 +4412,27 @@ handle_invisible_prop (struct it *it)
              IT_BYTEPOS (*it) = CHAR_TO_BYTE (newpos);
            }
 
+         if (display_ellipsis_p)
+            {
+              /* Make sure that the glyphs of the ellipsis will get
+                 correct `charpos' values.  If we would not update
+                 it->position here, the glyphs would belong to the
+                 last visible character _before_ the invisible
+                 text, which confuses `set_cursor_from_row'.
+
+                 We use the last invisible position instead of the
+                 first because this way the cursor is always drawn on
+                 the first "." of the ellipsis, whenever PT is inside
+                 the invisible text.  Otherwise the cursor would be
+                 placed _after_ the ellipsis when the point is after the
+                 first invisible character.  */
+             if (!STRINGP (it->object))
+               {
+                 it->position.charpos = newpos - 1;
+                 it->position.bytepos = CHAR_TO_BYTE (it->position.charpos);
+               }
+           }
+
          /* If there are before-strings at the start of invisible
             text, and the text is invisible because of a text
             property, arrange to show before-strings because 20.x did
@@ -4443,23 +4464,6 @@ handle_invisible_prop (struct it *it)
            }
          else if (display_ellipsis_p)
             {
-              /* Make sure that the glyphs of the ellipsis will get
-                 correct `charpos' values.  If we would not update
-                 it->position here, the glyphs would belong to the
-                 last visible character _before_ the invisible
-                 text, which confuses `set_cursor_from_row'.
-
-                 We use the last invisible position instead of the
-                 first because this way the cursor is always drawn on
-                 the first "." of the ellipsis, whenever PT is inside
-                 the invisible text.  Otherwise the cursor would be
-                 placed _after_ the ellipsis when the point is after the
-                 first invisible character.  */
-             if (!STRINGP (it->object))
-               {
-                 it->position.charpos = newpos - 1;
-                 it->position.bytepos = CHAR_TO_BYTE (it->position.charpos);
-               }
              it->ellipsis_p = true;
              /* Let the ellipsis display before
                 considering any properties of the following char.
@@ -4504,6 +4508,11 @@ setup_for_ellipsis (struct it *it, int len)
   if (it->saved_face_id < 0 || it->saved_face_id != it->face_id)
     it->saved_face_id = it->face_id = DEFAULT_FACE_ID;
 
+  /* If the ellipsis represents buffer text, it means we advanced in
+     the buffer, so we should no longer ignore overlay strings.  */
+  if (it->method == GET_FROM_BUFFER)
+    it->ignore_overlay_strings_at_pos_p = false;
+
   it->method = GET_FROM_DISPLAY_VECTOR;
   it->ellipsis_p = true;
 }
@@ -5427,7 +5436,6 @@ next_overlay_string (struct it *it)
                   && it->stop_charpos <= it->end_charpos));
       it->current.overlay_string_index = -1;
       it->n_overlay_strings = 0;
-      it->overlay_strings_charpos = -1;
       /* If there's an empty display string on the stack, pop the
         stack, to resync the bidi iterator with IT's position.  Such
         empty strings are pushed onto the stack in
@@ -5444,8 +5452,18 @@ next_overlay_string (struct it *it)
       /* If we're at the end of the buffer, record that we have
         processed the overlay strings there already, so that
         next_element_from_buffer doesn't try it again.  */
-      if (NILP (it->string) && IT_CHARPOS (*it) >= it->end_charpos)
+      if (NILP (it->string)
+         && IT_CHARPOS (*it) >= it->end_charpos
+         && it->overlay_strings_charpos >= it->end_charpos)
        it->overlay_strings_at_end_processed_p = true;
+      /* Note: we reset overlay_strings_charpos only here, to make
+        sure the just-processed overlays were indeed at EOB.
+        Otherwise, overlays on text with invisible text property,
+        which are processed with IT's position past the invisible
+        text, might fool us into thinking the overlays at EOB were
+        already processed (linum-mode can cause this, for
+        example).  */
+      it->overlay_strings_charpos = -1;
     }
   else
     {