diff src/xdisp.c @ 38190:dcc5dde7a1a0

(handle_invisible_prop): Deal with overlay strings at the start of invisible text. (setup_for_ellipsis): New function. (next_overlay_string): After all overlay strings have been processed, display an ellipsis if necessary. (load_overlay_strings, get_overlay_strings): Add parameter CHARPOS. (push_it): Initialize display_ellipsis_p on the iterator's stack.
author Gerd Moellmann <gerd@gnu.org>
date Tue, 26 Jun 2001 09:47:11 +0000
parents 22571591f506
children 2b6f6e16b9b6
line wrap: on
line diff
--- a/src/xdisp.c	Tue Jun 26 09:46:24 2001 +0000
+++ b/src/xdisp.c	Tue Jun 26 09:47:11 2001 +0000
@@ -659,6 +659,7 @@
 
 /* Function prototypes.  */
 
+static void setup_for_ellipsis P_ ((struct it *));
 static void mark_window_display_accurate_1 P_ ((struct window *, int));
 static int single_display_prop_string_p P_ ((Lisp_Object, Lisp_Object));
 static int display_prop_string_p P_ ((Lisp_Object, Lisp_Object));
@@ -732,7 +733,7 @@
 			       int, int, struct it *, int, int, int, int));
 static void compute_line_metrics P_ ((struct it *));
 static void run_redisplay_end_trigger_hook P_ ((struct it *));
-static int get_overlay_strings P_ ((struct it *));
+static int get_overlay_strings P_ ((struct it *, int));
 static void next_overlay_string P_ ((struct it *));
 static void reseat P_ ((struct it *, struct text_pos, int));
 static void reseat_1 P_ ((struct it *, struct text_pos, int));
@@ -746,7 +747,7 @@
 static int next_element_from_composition P_ ((struct it *));
 static int next_element_from_image P_ ((struct it *));
 static int next_element_from_stretch P_ ((struct it *));
-static void load_overlay_strings P_ ((struct it *));
+static void load_overlay_strings P_ ((struct it *, int));
 static void init_from_display_pos P_ ((struct it *, struct window *,
 				       struct display_pos *));
 static void reseat_to_string P_ ((struct it *, unsigned char *,
@@ -1848,7 +1849,7 @@
 	  it->current.overlay_string_index = 0;
 	  while (n--)
 	    {
-	      load_overlay_strings (it);
+	      load_overlay_strings (it, 0);
 	      it->current.overlay_string_index += OVERLAY_STRING_CHUNK_SIZE;
 	    }
 	}
@@ -2531,12 +2532,14 @@
     }
   else
     {
-      int visible_p, newpos, next_stop;
-      Lisp_Object pos, prop;
+      int visible_p, newpos, next_stop, start_charpos;
+      Lisp_Object pos, prop, overlay;
 
       /* First of all, is there invisible text at this position?  */
+      start_charpos = IT_CHARPOS (*it);
       pos = make_number (IT_CHARPOS (*it));
-      prop = Fget_char_property (pos, Qinvisible, it->window);
+      prop = get_char_property_and_overlay (pos, Qinvisible, it->window,
+					    &overlay);
       
       /* If we are on invisible text, skip over it.  */
       if (TEXT_PROP_MEANS_INVISIBLE (prop)
@@ -2585,36 +2588,25 @@
 		IT_CHARPOS (*it) = next_stop;
 	    }
 	  while (!visible_p);
-	  
+
 	  /* The position newpos is now either ZV or on visible text.  */
 	  IT_CHARPOS (*it) = newpos;
 	  IT_BYTEPOS (*it) = CHAR_TO_BYTE (newpos);
 	  
-	  /* Maybe return `...' next for the end of the invisible text.  */
-	  if (display_ellipsis_p)
-	    {
-	      if (it->dp 
-		  && VECTORP (DISP_INVIS_VECTOR (it->dp)))
-		{
-		  struct Lisp_Vector *v = XVECTOR (DISP_INVIS_VECTOR (it->dp));
-		  it->dpvec = v->contents;
-		  it->dpend = v->contents + v->size;
-		}
-	      else 
-		{
-		  /* Default `...'.  */
-		  it->dpvec = default_invis_vector;
-		  it->dpend = default_invis_vector + 3;
-		}
-
-	      /* The ellipsis display does not replace the display of
-	         the character at the new position.  Indicate this by
-	         setting IT->dpvec_char_len to zero.  */
-	      it->dpvec_char_len = 0;
-	      
-	      it->current.dpvec_index = 0;
-	      it->method = next_element_from_display_vector;
-	    }
+	  /* 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
+	     it that way.  (If the text is invisible because of an
+	     overlay property instead of a text property, this is
+	     already handled in the overlay code.)  */
+	  if (NILP (overlay)
+	      && get_overlay_strings (it, start_charpos))
+	    {
+	      handled = HANDLED_RECOMPUTE_PROPS;
+	      it->stack[it->sp - 1].display_ellipsis_p = display_ellipsis_p;
+	    }
+	  else if (display_ellipsis_p)
+	    setup_for_ellipsis (it);
 	}
     }
 
@@ -2622,6 +2614,36 @@
 }
 
 
+/* Make iterator IT return `...' next.  */
+
+static void
+setup_for_ellipsis (it)
+     struct it *it;
+{
+  if (it->dp 
+      && VECTORP (DISP_INVIS_VECTOR (it->dp)))
+    {
+      struct Lisp_Vector *v = XVECTOR (DISP_INVIS_VECTOR (it->dp));
+      it->dpvec = v->contents;
+      it->dpend = v->contents + v->size;
+    }
+  else 
+    {
+      /* Default `...'.  */
+      it->dpvec = default_invis_vector;
+      it->dpend = default_invis_vector + 3;
+    }
+  
+  /* The ellipsis display does not replace the display of the
+     character at the new position.  Indicate this by setting
+     IT->dpvec_char_len to zero.  */
+  it->dpvec_char_len = 0;
+  
+  it->current.dpvec_index = 0;
+  it->method = next_element_from_display_vector;
+}
+
+
 
 /***********************************************************************
 			    'display' property
@@ -3285,7 +3307,7 @@
 handle_overlay_change (it)
      struct it *it;
 {
-  if (!STRINGP (it->string) && get_overlay_strings (it))
+  if (!STRINGP (it->string) && get_overlay_strings (it, 0))
     return HANDLED_RECOMPUTE_PROPS;
   else
     return HANDLED_NORMALLY;
@@ -3309,6 +3331,8 @@
       /* No more overlay strings.  Restore IT's settings to what
 	 they were before overlay strings were processed, and
 	 continue to deliver from current_buffer.  */
+      int display_ellipsis_p = it->stack[it->sp - 1].display_ellipsis_p;
+      
       pop_it (it);
       xassert (it->stop_charpos >= BEGV
 	       && it->stop_charpos <= it->end_charpos);
@@ -3323,6 +3347,11 @@
 	 next_element_from_buffer doesn't try it again.  */
       if (IT_CHARPOS (*it) >= it->end_charpos)
 	it->overlay_strings_at_end_processed_p = 1;
+
+      /* If we have to display `...' for invisible text, set
+	 the iterator up for that.  */
+      if (display_ellipsis_p)
+	setup_for_ellipsis (it);
     }
   else
     {
@@ -3333,7 +3362,7 @@
       int i = it->current.overlay_string_index % OVERLAY_STRING_CHUNK_SIZE;
   
       if (it->current.overlay_string_index && i == 0)
-	load_overlay_strings (it);
+	load_overlay_strings (it, 0);
 
       /* Initialize IT to deliver display elements from the overlay
          string.  */
@@ -3393,8 +3422,8 @@
 
 
 /* Load the vector IT->overlay_strings with overlay strings from IT's
-   current buffer position.  Set IT->n_overlays to the total number of
-   overlay strings found.  
+   current buffer position, or from CHARPOS if that is > 0.  Set
+   IT->n_overlays to the total number of overlay strings found.
 
    Overlay strings are processed OVERLAY_STRING_CHUNK_SIZE strings at
    a time.  On entry into load_overlay_strings,
@@ -3417,8 +3446,9 @@
    compare_overlay_entries.  */
    
 static void
-load_overlay_strings (it)
+load_overlay_strings (it, charpos)
      struct it *it;
+     int charpos;
 {
   extern Lisp_Object Qafter_string, Qbefore_string, Qwindow, Qpriority;
   Lisp_Object ov, overlay, window, str, invisible;
@@ -3427,7 +3457,9 @@
   int n = 0, i, j, invis_p;
   struct overlay_entry *entries
     = (struct overlay_entry *) alloca (size * sizeof *entries);
-  int charpos = IT_CHARPOS (*it);
+
+  if (charpos <= 0)
+    charpos = IT_CHARPOS (*it);
 
   /* Append the overlay string STRING of overlay OVERLAY to vector
      `entries' which has size `size' and currently contains `n'
@@ -3559,12 +3591,13 @@
 
 
 /* Get the first chunk of overlay strings at IT's current buffer
-   position.  Value is non-zero if at least one overlay string was
-   found.   */
+   position, or at CHARPOS if that is > 0.  Value is non-zero if at
+   least one overlay string was found.  */
 
 static int
-get_overlay_strings (it)
+get_overlay_strings (it, charpos)
      struct it *it;
+     int charpos;
 {
   /* Get the first OVERLAY_STRING_CHUNK_SIZE overlay strings to
      process.  This fills IT->overlay_strings with strings, and sets
@@ -3574,7 +3607,7 @@
      when no overlay strings are found because a zero value would
      indicate a position in the first overlay string.  */
   it->current.overlay_string_index = 0;
-  load_overlay_strings (it);
+  load_overlay_strings (it, charpos);
 
   /* If we found overlay strings, set up IT to deliver display
      elements from the first one.  Otherwise set up IT to deliver
@@ -3648,6 +3681,7 @@
   p->font_height = it->font_height;
   p->voffset = it->voffset;
   p->string_from_display_prop_p = it->string_from_display_prop_p;
+  p->display_ellipsis_p = 0;
   ++it->sp;
 }
 
@@ -4702,7 +4736,7 @@
 	  else
 	    {
 	      it->overlay_strings_at_end_processed_p = 1;
-	      overlay_strings_follow_p = get_overlay_strings (it);
+	      overlay_strings_follow_p = get_overlay_strings (it, 0);
 	    }
 
 	  if (overlay_strings_follow_p)