diff src/xdisp.c @ 83231:549734260e34

Merged in changes from CVS trunk. Patches applied: * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-714 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-271
author Karoly Lorentey <lorentey@elte.hu>
date Wed, 08 Dec 2004 22:20:27 +0000
parents 2a3f27a45698 5c07c674b739
children 6b379caca6fa
line wrap: on
line diff
--- a/src/xdisp.c	Sun Nov 28 14:39:06 2004 +0000
+++ b/src/xdisp.c	Wed Dec 08 22:20:27 2004 +0000
@@ -803,7 +803,7 @@
 
 /* Function prototypes.  */
 
-static void setup_for_ellipsis P_ ((struct it *));
+static void setup_for_ellipsis P_ ((struct it *, int));
 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));
@@ -3223,7 +3223,7 @@
 	      it->stack[it->sp - 1].display_ellipsis_p = display_ellipsis_p;
 	    }
 	  else if (display_ellipsis_p)
-	    setup_for_ellipsis (it);
+	    setup_for_ellipsis (it, 0);
 	}
     }
 
@@ -3231,14 +3231,17 @@
 }
 
 
-/* Make iterator IT return `...' next.  */
-
-static void
-setup_for_ellipsis (it)
-     struct it *it;
-{
-  if (it->dp
-      && VECTORP (DISP_INVIS_VECTOR (it->dp)))
+/* Make iterator IT return `...' next.
+   Replaces LEN characters from buffer.  */
+
+static void
+setup_for_ellipsis (it, len)
+     struct it *it;
+     int len;
+{
+  /* Use the display table definition for `...'.  Invalid glyphs
+     will be handled by the method returning elements from dpvec.  */
+  if (it->dp && VECTORP (DISP_INVIS_VECTOR (it->dp)))
     {
       struct Lisp_Vector *v = XVECTOR (DISP_INVIS_VECTOR (it->dp));
       it->dpvec = v->contents;
@@ -3251,12 +3254,12 @@
       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->dpvec_char_len = len;
   it->current.dpvec_index = 0;
+
+  /* Remember the current face id in case glyphs specify faces.
+     IT's face is restored in set_iterator_to_next.  */
+  it->saved_face_id = it->face_id;
   it->method = next_element_from_display_vector;
 }
 
@@ -3571,7 +3574,7 @@
 	      || EQ (XCAR (prop), Qright_fringe))
 	  && CONSP (XCDR (prop)))
 	{
-	  unsigned face_id = DEFAULT_FACE_ID;
+	  int face_id = DEFAULT_FACE_ID;
 	  int fringe_bitmap;
 
 	  /* Save current settings of IT so that we can restore them
@@ -3590,10 +3593,9 @@
 	  if (CONSP (XCDR (XCDR (prop))))
 	    {
 	      Lisp_Object face_name = XCAR (XCDR (XCDR (prop)));
-
-	      face_id = lookup_named_face (it->f, face_name, 'A');
-	      if (face_id < 0)
-		return 0;
+	      int face_id2 = lookup_named_face (it->f, face_name, 'A', 0);
+	      if (face_id2 >= 0)
+		face_id = face_id2;
 	    }
 
 	  push_it (it);
@@ -4048,7 +4050,7 @@
       /* If we have to display `...' for invisible text, set
 	 the iterator up for that.  */
       if (display_ellipsis_p)
-	setup_for_ellipsis (it);
+	setup_for_ellipsis (it, 0);
     }
   else
     {
@@ -4840,7 +4842,10 @@
      we hit the end of what we iterate over.  Performance note: the
      function pointer `method' used here turns out to be faster than
      using a sequence of if-statements.  */
-  int success_p = (*it->method) (it);
+  int success_p;
+
+ get_next:
+  success_p = (*it->method) (it);
 
   if (it->what == IT_CHARACTER)
     {
@@ -4872,14 +4877,14 @@
 		  it->dpvec = v->contents;
 		  it->dpend = v->contents + v->size;
 		  it->current.dpvec_index = 0;
+		  it->saved_face_id = it->face_id;
 		  it->method = next_element_from_display_vector;
-		  success_p = get_next_display_element (it);
 		}
 	      else
 		{
 		  set_iterator_to_next (it, 0);
-		  success_p = get_next_display_element (it);
-		}
+		}
+	      goto get_next;
 	    }
 
 	  /* Translate control characters into `\003' or `^C' form.
@@ -4915,6 +4920,7 @@
 		 IT->ctl_chars with glyphs for what we have to
 		 display.  Then, set IT->dpvec to these glyphs.  */
 	      GLYPH g;
+	      int ctl_len;
 
 	      if (it->c < 128 && it->ctl_arrow_p)
 		{
@@ -4929,14 +4935,7 @@
 
 		  g = FAST_MAKE_GLYPH (it->c ^ 0100, 0);
 		  XSETINT (it->ctl_chars[1], g);
-
-		  /* Set up IT->dpvec and return first character from it.  */
-		  it->dpvec_char_len = it->len;
-		  it->dpvec = it->ctl_chars;
-		  it->dpend = it->dpvec + 2;
-		  it->current.dpvec_index = 0;
-		  it->method = next_element_from_display_vector;
-		  get_next_display_element (it);
+		  ctl_len = 2;
 		}
 	      else
 		{
@@ -4985,16 +4984,17 @@
 		      g = FAST_MAKE_GLYPH ((str[i] & 7) + '0', 0);
 		      XSETINT (it->ctl_chars[i * 4 + 3], g);
 		    }
-
-		  /* Set up IT->dpvec and return the first character
-                     from it.  */
-		  it->dpvec_char_len = it->len;
-		  it->dpvec = it->ctl_chars;
-		  it->dpend = it->dpvec + len * 4;
-		  it->current.dpvec_index = 0;
-		  it->method = next_element_from_display_vector;
-		  get_next_display_element (it);
-		}
+		  ctl_len = len * 4;
+		}
+
+	      /* Set up IT->dpvec and return first character from it.  */
+	      it->dpvec_char_len = it->len;
+	      it->dpvec = it->ctl_chars;
+	      it->dpend = it->dpvec + ctl_len;
+	      it->current.dpvec_index = 0;
+	      it->saved_face_id = it->face_id;
+	      it->method = next_element_from_display_vector;
+	      goto get_next;
 	    }
 	}
 
@@ -5184,11 +5184,14 @@
 	       && IT_STRING_CHARPOS (*it) >= 0));
 }
 
-
 /* Load IT's display element fields with information about the next
    display element which comes from a display table entry or from the
    result of translating a control character to one of the forms `^C'
-   or `\003'.  IT->dpvec holds the glyphs to return as characters.  */
+   or `\003'.
+
+   IT->dpvec holds the glyphs to return as characters.
+   IT->saved_face_id holds the face id before the display vector--
+   it is restored into IT->face_idin set_iterator_to_next.  */
 
 static int
 next_element_from_display_vector (it)
@@ -5197,10 +5200,6 @@
   /* Precondition.  */
   xassert (it->dpvec && it->current.dpvec_index >= 0);
 
-  /* Remember the current face id in case glyphs specify faces.
-     IT's face is restored in set_iterator_to_next.  */
-  it->saved_face_id = it->face_id;
-
   if (INTEGERP (*it->dpvec)
       && GLYPH_CHAR_VALID_P (XFASTINT (*it->dpvec)))
     {
@@ -5384,28 +5383,7 @@
      struct it *it;
 {
   if (it->selective_display_ellipsis_p)
-    {
-      if (it->dp && VECTORP (DISP_INVIS_VECTOR (it->dp)))
-	{
-	  /* Use the display table definition for `...'.  Invalid glyphs
-	     will be handled by the method returning elements from dpvec.  */
-	  struct Lisp_Vector *v = XVECTOR (DISP_INVIS_VECTOR (it->dp));
-	  it->dpvec_char_len = it->len;
-	  it->dpvec = v->contents;
-	  it->dpend = v->contents + v->size;
-	  it->current.dpvec_index = 0;
-	  it->method = next_element_from_display_vector;
-	}
-      else
-	{
-	  /* Use default `...' which is stored in default_invis_vector.  */
-	  it->dpvec_char_len = it->len;
-	  it->dpvec = default_invis_vector;
-	  it->dpend = default_invis_vector + 3;
-	  it->current.dpvec_index = 0;
-	  it->method = next_element_from_display_vector;
-	}
-    }
+    setup_for_ellipsis (it, it->len);
   else
     {
       /* The face at the current position may be different from the
@@ -5776,8 +5754,6 @@
 				  result = MOVE_NEWLINE_OR_CR;
 				  break;
 				}
-			      if (it->method == next_element_from_display_vector)
-				it->face_id = it->saved_face_id;
 			    }
 #endif /* HAVE_WINDOW_SYSTEM */
 			}
@@ -14538,7 +14514,9 @@
 		  && glyph->u.ch == ' '))
 	  && trailing_whitespace_p (glyph->charpos))
 	{
-	  int face_id = lookup_named_face (f, Qtrailing_whitespace, 0);
+	  int face_id = lookup_named_face (f, Qtrailing_whitespace, 0, 0);
+	  if (face_id < 0)
+	    return;
 
 	  while (glyph >= start
 		 && BUFFERP (glyph->object)
@@ -14631,8 +14609,10 @@
      hscrolled.  This may stop at an x-position < IT->first_visible_x
      if the first glyph is partially visible or if we hit a line end.  */
   if (it->current_x < it->first_visible_x)
-    move_it_in_display_line_to (it, ZV, it->first_visible_x,
-				MOVE_TO_POS | MOVE_TO_X);
+    {
+      move_it_in_display_line_to (it, ZV, it->first_visible_x,
+				  MOVE_TO_POS | MOVE_TO_X);
+    }
 
   /* Get the initial row height.  This is either the height of the
      text hscrolled, if there is any, or zero.  */
@@ -14791,8 +14771,6 @@
 				  row->continued_p = 0;
 				  row->exact_window_width_line_p = 1;
 				}
-			      else if (it->method == next_element_from_display_vector)
-				it->face_id = it->saved_face_id;
 			    }
 #endif /* HAVE_WINDOW_SYSTEM */
 			}
@@ -18812,7 +18790,7 @@
       struct face *face;
       struct font_info *font_info;
 
-      face_id = lookup_named_face (it->f, face_name, ' ');
+      face_id = lookup_named_face (it->f, face_name, ' ', 0);
       if (face_id < 0)
 	return make_number (-1);