changeset 5617:b0d712bbc2a6

The "flush" face property. -------------------- ChangeLog entries follow: -------------------- src/ChangeLog addition: 2011-12-23 Didier Verna <didier@xemacs.org> * faces.h (struct Lisp_Face): New 'flush slot. * faces.h (struct face_cachel): New 'flush and 'flush_specified flags. * faces.h (WINDOW_FACE_CACHEL_FLUSH_P): * faces.h (FACE_FLUSH_P): New macros. * faces.c: Declare Qflush. * lisp.h: Externalize it. * faces.c (syms_of_faces): Define it. * faces.c (vars_of_faces): Update built-in face specifiers. * faces.c (complex_vars_of_faces): Update specifier fallbacks. * faces.c (mark_face): * faces.c (face_equal): * faces.c (face_getprop): * faces.c (face_putprop): * faces.c (face_remprop): * faces.c (face_plist): * faces.c (reset_face): * faces.c (update_face_inheritance_mapper): * faces.c (Fmake_face): * faces.c (update_face_cachel_data): * faces.c (merge_face_cachel_data): * faces.c (Fcopy_face): * fontcolor.c (face_boolean_validate): Handle the flush property. * redisplay.h (struct display_line): Rename 'default_findex slot to clearer name 'clear_findex. * redisplay.h (DISPLAY_LINE_INIT): Update accordingly. * redisplay-output.c (compare_display_blocks): * redisplay-output.c (output_display_line): * redisplay-output.c (redisplay_output_window): * redisplay.c (regenerate_window_extents_only_changed): * redisplay.c (regenerate_window_incrementally): Update the comparison tests between the current and desired display lines to cope for different 'clear_findex values. * redisplay.c (create_text_block): Initialize the display line's 'clear_findex slot to DEFAULT_INDEX. Record a new 'clear_findex value when we encounter a newline character displayed in a flushed face. * redisplay.c (create_string_text_block): Record a new 'clear_findex value when we encounter a newline character displayed in a flushed face. lisp/ChangeLog addition: 2011-12-23 Didier Verna <didier@xemacs.org> * cl-macs.el (face-flush-p): New defsetf. * faces.el (set-face-property): Document the flush property. * faces.el (face-flush-p): New function. * faces.el (set-face-flush-p): New function. * faces.el (face-equal): * cus-face.el (custom-face-attributes): * x-faces.el (x-init-face-from-resources): * x-faces.el (make-face-x-resource-internal): Handle the flush property.
author Didier Verna <didier@xemacs.org>
date Fri, 23 Dec 2011 10:56:16 +0100
parents 79e9934779c1
children cc1ec4c93a67
files lisp/ChangeLog lisp/cl-macs.el lisp/cus-face.el lisp/faces.el lisp/x-faces.el src/ChangeLog src/faces.c src/faces.h src/fontcolor.c src/lisp.h src/redisplay-output.c src/redisplay.c src/redisplay.h
diffstat 13 files changed, 171 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Thu Dec 22 15:02:02 2011 +0000
+++ b/lisp/ChangeLog	Fri Dec 23 10:56:16 2011 +0100
@@ -1,3 +1,15 @@
+2011-12-23  Didier Verna  <didier@xemacs.org>
+
+	* cl-macs.el (face-flush-p): New defsetf.
+	* faces.el (set-face-property): Document the flush property.
+	* faces.el (face-flush-p): New function.
+	* faces.el (set-face-flush-p): New function.
+	* faces.el (face-equal):
+	* cus-face.el (custom-face-attributes):
+	* x-faces.el (x-init-face-from-resources):
+	* x-faces.el (make-face-x-resource-internal): Handle the flush
+	property.
+
 2011-12-22  Aidan Kehoe  <kehoea@parhasard.net>
 
 	* bytecomp-runtime.el:
--- a/lisp/cl-macs.el	Thu Dec 22 15:02:02 2011 +0000
+++ b/lisp/cl-macs.el	Fri Dec 23 10:56:16 2011 +0100
@@ -2120,6 +2120,8 @@
 (defsetf face-foreground (f &optional s) (x) (list 'set-face-foreground f x s))
 (defsetf face-underline-p (f &optional s) (x)
   (list 'set-face-underline-p f x s))
+(defsetf face-flush-p (f &optional s) (x)
+  (list 'set-face-flush-p f x s))
 (defsetf file-modes set-file-modes t)
 (defsetf frame-height (&optional f) (v)
   `(progn (set-frame-height ,f ,v) ,v))
--- a/lisp/cus-face.el	Thu Dec 22 15:02:02 2011 +0000
+++ b/lisp/cus-face.el	Fri Dec 23 10:56:16 2011 +0100
@@ -126,6 +126,10 @@
 			    :help-echo "\
 Control whether the text should be inverted.  Works only on TTY-s")
 		    set-face-reverse-p face-reverse-p)
+    (:flush (toggle :format "%[Flush%]: %v\n"
+		    :help-echo "\
+Control whether the face should flush to the right border.")
+		    set-face-flush-p face-flush-p)
     (:inherit
      (repeat :tag "Inherit"
 	     :help-echo "List of faces to inherit attributes from."
--- a/lisp/faces.el	Thu Dec 22 15:02:02 2011 +0000
+++ b/lisp/faces.el	Fri Dec 23 10:56:16 2011 +0100
@@ -361,6 +361,12 @@
                     Only used by faces on TTY devices.
                     For valid instantiators, see `make-face-boolean-specifier'.
 
+ flush              When the end of line is reached in a flushing face, also
+                    paint the rest of the line (up to the right border) with
+                    that face. The effect will only be visible if the face has
+                    a non default background.
+                    For valid instantiators, see `make-face-boolean-specifier'.
+
  inherit	    Face name or face object from which to inherit attributes,
                     or a list of such elements.  Attributes from inherited
                     faces are merged into the face like an underlying face
@@ -897,6 +903,20 @@
   (interactive (face-interactive "reverse-p" "reversed"))
   (set-face-property face 'reverse reverse-p locale tag-set how-to-add))
 
+(defun face-flush-p (face &optional domain default no-fallback)
+  "Return t if FACE is flushed in DOMAIN.
+See `face-property-instance' for the semantics of the DOMAIN argument."
+  (face-property-instance face 'flush domain default no-fallback))
+
+(defun set-face-flush-p (face flush-p &optional locale tag-set how-to-add)
+  "Change whether FACE is flushed in LOCALE.
+FLUSH-P is normally a face-boolean instantiator; see
+ `make-face-boolean-specifier'.
+See `set-face-property' for the semantics of the LOCALE, TAG-SET, and
+ HOW-TO-ADD arguments."
+  (interactive (face-interactive "flush-p" "flushed"))
+  (set-face-property face 'flush flush-p locale tag-set how-to-add))
+
 
 (defun face-property-equal (face1 face2 prop domain)
   (equal (face-property-instance face1 prop domain)
@@ -916,7 +936,7 @@
       (error "Invalid specifier domain"))
   (let ((device (dfw-device domain))
 	(common-props '(foreground background font display-table underline
-				   dim inherit))
+				   dim inherit flush))
 	(win-props '(background-pixmap background-placement strikethru))
 	(tty-props '(highlight blinking reverse)))
 
--- a/lisp/x-faces.el	Thu Dec 22 15:02:02 2011 +0000
+++ b/lisp/x-faces.el	Fri Dec 23 10:56:16 2011 +0100
@@ -714,6 +714,10 @@
 	       (concat name ".attributeStrikethru")
 	       "Face.AttributeStrikethru"
 	       'boolean locale))
+	 (fp (x-get-resource-and-maybe-bogosity-check
+	      (concat name ".attributeFlush")
+	      "Face.AttributeFlush"
+	      'boolean locale))
 	 ;; we still resource for these TTY-only resources so that you can
 	 ;; specify resources for TTY frames/devices. This is useful when you
 	 ;; start up your XEmacs on an X display and later open some TTY
@@ -879,6 +883,22 @@
 	(remove-specifier (face-property face 'reverse) locale
 			  tty-tag-set nil))
       (set-face-reverse-p face rp locale our-tag-set append))
+    (when fp
+      (cond (device-class
+	     (remove-specifier-specs-matching-tag-set-cdrs (face-property
+							    face 'flush)
+							   locale
+							   tty-tag-set)
+	     (remove-specifier-specs-matching-tag-set-cdrs (face-property
+							    face 'flush)
+							   locale
+							   x-tag-set))
+	    (t
+	     (remove-specifier (face-property face 'flush) locale
+			       tty-tag-set nil)
+	     (remove-specifier (face-property face 'flush) locale
+			       x-tag-set nil)))
+      (set-face-flush-p face fp locale our-tag-set append))
     ))
 
 ;; GNU Emacs compatibility. (move to obsolete.el?)
--- a/src/ChangeLog	Thu Dec 22 15:02:02 2011 +0000
+++ b/src/ChangeLog	Fri Dec 23 10:56:16 2011 +0100
@@ -1,3 +1,46 @@
+2011-12-23  Didier Verna  <didier@xemacs.org>
+
+	* faces.h (struct Lisp_Face): New 'flush slot.
+	* faces.h (struct face_cachel): New 'flush and 'flush_specified
+	flags.
+	* faces.h (WINDOW_FACE_CACHEL_FLUSH_P):
+	* faces.h (FACE_FLUSH_P): New macros.
+	* faces.c: Declare Qflush.
+	* lisp.h: Externalize it.
+	* faces.c (syms_of_faces): Define it.
+	* faces.c (vars_of_faces): Update built-in face specifiers.
+	* faces.c (complex_vars_of_faces): Update specifier fallbacks.
+	* faces.c (mark_face):
+	* faces.c (face_equal):
+	* faces.c (face_getprop):
+	* faces.c (face_putprop):
+	* faces.c (face_remprop):
+	* faces.c (face_plist):
+	* faces.c (reset_face):
+	* faces.c (update_face_inheritance_mapper):
+	* faces.c (Fmake_face):
+	* faces.c (update_face_cachel_data):
+	* faces.c (merge_face_cachel_data):
+	* faces.c (Fcopy_face):
+	* fontcolor.c (face_boolean_validate): Handle the flush property.
+	* redisplay.h (struct display_line): Rename 'default_findex slot to
+	clearer name 'clear_findex.
+	* redisplay.h (DISPLAY_LINE_INIT): Update accordingly.
+	* redisplay-output.c (compare_display_blocks):
+	* redisplay-output.c (output_display_line):
+	* redisplay-output.c (redisplay_output_window):
+	* redisplay.c (regenerate_window_extents_only_changed):
+	* redisplay.c (regenerate_window_incrementally): Update the
+	comparison tests between the current and desired display lines to
+	cope for different 'clear_findex values.	
+	* redisplay.c (create_text_block): Initialize the display line's
+	'clear_findex slot to DEFAULT_INDEX. Record a new 'clear_findex
+	value when we encounter a newline character displayed in a flushed
+	face.
+	* redisplay.c (create_string_text_block): Record a new
+	'clear_findex value when we encounter a newline character
+	displayed in a flushed face.
+
 2011-12-22  Aidan Kehoe  <kehoea@parhasard.net>
 
 	* select-gtk.c (vars_of_select_gtk):
--- a/src/faces.c	Thu Dec 22 15:02:02 2011 +0000
+++ b/src/faces.c	Fri Dec 23 10:56:16 2011 +0100
@@ -42,7 +42,7 @@
 Lisp_Object Qfacep;
 Lisp_Object Qforeground, Qbackground, Qdisplay_table;
 Lisp_Object Qbackground_pixmap, Qbackground_placement, Qunderline, Qdim;
-Lisp_Object Qblinking, Qstrikethru, Q_name;
+Lisp_Object Qblinking, Qstrikethru, Qflush, Q_name;
 
 Lisp_Object Qinit_face_from_resources;
 Lisp_Object Qinit_frame_faces;
@@ -117,6 +117,7 @@
   mark_object (face->dim);
   mark_object (face->blinking);
   mark_object (face->reverse);
+  mark_object (face->flush);
 
   mark_object (face->charsets_warned_about);
 
@@ -171,6 +172,7 @@
      internal_equal (f1->dim,		     f2->dim,		    depth) &&
      internal_equal (f1->blinking,	     f2->blinking,	    depth) &&
      internal_equal (f1->reverse,	     f2->reverse,	    depth) &&
+     internal_equal (f1->flush,	             f2->flush,	            depth) &&
 
      ! plists_differ (f1->plist, f2->plist, 0, 0, depth + 1, 0));
 }
@@ -207,6 +209,7 @@
      EQ (prop, Qdim)		      ? f->dim                  :
      EQ (prop, Qblinking)	      ? f->blinking             :
      EQ (prop, Qreverse)	      ? f->reverse              :
+     EQ (prop, Qflush)	              ? f->flush                :
      EQ (prop, Qdoc_string)	      ? f->doc_string           :
      external_plist_get (&f->plist, prop, 0, ERROR_ME));
 }
@@ -227,7 +230,8 @@
       EQ (prop, Qhighlight)            ||
       EQ (prop, Qdim)                  ||
       EQ (prop, Qblinking)             ||
-      EQ (prop, Qreverse))
+      EQ (prop, Qreverse)              ||
+      EQ (prop, Qflush))
     return 0;
 
   if (EQ (prop, Qdoc_string))
@@ -258,7 +262,8 @@
       EQ (prop, Qhighlight)            ||
       EQ (prop, Qdim)                  ||
       EQ (prop, Qblinking)             ||
-      EQ (prop, Qreverse))
+      EQ (prop, Qreverse)              ||
+      EQ (prop, Qflush))
     return -1;
 
   if (EQ (prop, Qdoc_string))
@@ -276,6 +281,7 @@
   Lisp_Face *face = XFACE (obj);
   Lisp_Object result = face->plist;
 
+  result = cons3 (Qflush,	         face->flush,	               result);
   result = cons3 (Qreverse,	         face->reverse,	               result);
   result = cons3 (Qblinking,	         face->blinking,               result);
   result = cons3 (Qdim,		         face->dim,	               result);
@@ -307,6 +313,7 @@
   { XD_LISP_OBJECT, offsetof (Lisp_Face, dim) },
   { XD_LISP_OBJECT, offsetof (Lisp_Face, blinking) },
   { XD_LISP_OBJECT, offsetof (Lisp_Face, reverse) },
+  { XD_LISP_OBJECT, offsetof (Lisp_Face, flush) },
   { XD_LISP_OBJECT, offsetof (Lisp_Face, plist) },
   { XD_LISP_OBJECT, offsetof (Lisp_Face, charsets_warned_about) },
   { XD_END }
@@ -400,6 +407,7 @@
   f->dim = Qnil;
   f->blinking = Qnil;
   f->reverse = Qnil;
+  f->flush = Qnil;
   f->plist = Qnil;
   f->charsets_warned_about = Qnil;
 }
@@ -554,7 +562,8 @@
 	   EQ (fcl->property, Qhighlight)  ||
 	   EQ (fcl->property, Qdim)        ||
 	   EQ (fcl->property, Qblinking)   ||
-	   EQ (fcl->property, Qreverse))
+	   EQ (fcl->property, Qreverse)    ||
+	   EQ (fcl->property, Qflush))
     {
       update_inheritance_mapper_internal (contents, fcl->face, Qunderline);
       update_inheritance_mapper_internal (contents, fcl->face, Qstrikethru);
@@ -562,6 +571,7 @@
       update_inheritance_mapper_internal (contents, fcl->face, Qdim);
       update_inheritance_mapper_internal (contents, fcl->face, Qblinking);
       update_inheritance_mapper_internal (contents, fcl->face, Qreverse);
+      update_inheritance_mapper_internal (contents, fcl->face, Qflush);
     }
   return 0;
 }
@@ -869,6 +879,8 @@
   set_face_boolean_attached_to (f->blinking, face, Qblinking);
   f->reverse = Fmake_specifier (Qface_boolean);
   set_face_boolean_attached_to (f->reverse, face, Qreverse);
+  f->flush = Fmake_specifier (Qface_boolean);
+  set_face_boolean_attached_to (f->flush, face, Qflush);
   if (!NILP (Vdefault_face))
     {
       /* If the default face has already been created, set it as
@@ -901,6 +913,8 @@
 			     Fget (Vdefault_face, Qblinking, Qunbound));
       set_specifier_fallback (f->reverse,
 			     Fget (Vdefault_face, Qreverse, Qunbound));
+      set_specifier_fallback (f->flush,
+			     Fget (Vdefault_face, Qflush, Qunbound));
     }
 
   /* Add the face to the appropriate list. */
@@ -1471,6 +1485,7 @@
       FROB (highlight);
       FROB (dim);
       FROB (reverse);
+      FROB (flush);
       FROB (blinking);
 #undef FROB
     }
@@ -1510,6 +1525,7 @@
   FROB (highlight);
   FROB (dim);
   FROB (reverse);
+  FROB (flush);
   FROB (blinking);
 
   for (offs = 0; offs < NUM_LEADING_BYTES; ++offs)
@@ -2023,6 +2039,7 @@
   COPY_PROPERTY (dim);
   COPY_PROPERTY (blinking);
   COPY_PROPERTY (reverse);
+  COPY_PROPERTY (flush);
 #undef COPY_PROPERTY
   /* #### should it copy the individual specifiers, if they exist? */
   fnew->plist = Fcopy_sequence (fold->plist);
@@ -2162,6 +2179,7 @@
   /* Qhighlight, Qreverse defined in general.c */
   DEFSYMBOL (Qdim);
   DEFSYMBOL (Qblinking);
+  DEFSYMBOL (Qflush);
 
   DEFSYMBOL (Qface_alias);
   DEFERROR_STANDARD (Qcyclic_face_alias, Qinvalid_state);
@@ -2228,7 +2246,7 @@
   Vbuilt_in_face_specifiers =
     listu (Qforeground, Qbackground, Qfont, Qdisplay_table, Qbackground_pixmap,
 	   Qbackground_placement, Qunderline, Qstrikethru, Qhighlight, Qdim,
-	   Qblinking, Qreverse, Qunbound);
+	   Qblinking, Qreverse, Qflush, Qunbound);
   staticpro (&Vbuilt_in_face_specifiers);
 }
 
@@ -2484,6 +2502,8 @@
 			 list1 (Fcons (Qnil, Qnil)));
   set_specifier_fallback (Fget (Vdefault_face, Qreverse, Qnil),
 			 list1 (Fcons (Qnil, Qnil)));
+  set_specifier_fallback (Fget (Vdefault_face, Qflush, Qnil),
+			 list1 (Fcons (Qnil, Qnil)));
 
   /* gui-element is the parent face of all gui elements such as
      modeline, vertical divider and toolbar. */
--- a/src/faces.h	Thu Dec 22 15:02:02 2011 +0000
+++ b/src/faces.h	Fri Dec 23 10:56:16 2011 +0100
@@ -54,6 +54,7 @@
   Lisp_Object dim;
   Lisp_Object blinking;
   Lisp_Object reverse;
+  Lisp_Object flush;
 
   Lisp_Object plist;
 
@@ -180,6 +181,7 @@
   unsigned int dim :1;
   unsigned int blinking :1;
   unsigned int reverse :1;
+  unsigned int flush :1;
 
   /* Used when merging to tell if the above field represents an actual
      value of this face or a fallback value. */
@@ -197,6 +199,7 @@
   unsigned int dim_specified :1;
   unsigned int blinking_specified :1;
   unsigned int reverse_specified :1;
+  unsigned int flush_specified :1;
 
   /* The updated flag is set after we calculate the values for the
      face cachel and cleared whenever a face changes, to indicate
@@ -356,6 +359,8 @@
   (WINDOW_FACE_CACHEL (window, index)->blinking)
 #define WINDOW_FACE_CACHEL_REVERSE_P(window, index)			\
   (WINDOW_FACE_CACHEL (window, index)->reverse)
+#define WINDOW_FACE_CACHEL_FLUSH_P(window, index)			\
+  (WINDOW_FACE_CACHEL (window, index)->flush)
 
 #define FACE_PROPERTY_SPECIFIER(face, property) Fget (face, property, Qnil)
 
@@ -417,5 +422,7 @@
   (!NILP (FACE_PROPERTY_INSTANCE (face, Qblinking, domain, 0, Qzero)))
 #define FACE_REVERSE_P(face, domain)					\
   (!NILP (FACE_PROPERTY_INSTANCE (face, Qreverse, domain, 0, Qzero)))
+#define FACE_FLUSH_P(face, domain)					\
+  (!NILP (FACE_PROPERTY_INSTANCE (face, Qflush, domain, 0, Qzero)))
 
 #endif /* INCLUDED_faces_h_ */
--- a/src/fontcolor.c	Thu Dec 22 15:02:02 2011 +0000
+++ b/src/fontcolor.c	Fri Dec 23 10:56:16 2011 +0100
@@ -1159,7 +1159,8 @@
 	      && !EQ (field, Qhighlight)
 	      && !EQ (field, Qdim)
 	      && !EQ (field, Qblinking)
-	      && !EQ (field, Qreverse))
+	      && !EQ (field, Qreverse)
+	      && !EQ (field, Qflush))
 	    invalid_constant ("Invalid face-boolean inheritance field",
 				 field);
 	}
--- a/src/lisp.h	Thu Dec 22 15:02:02 2011 +0000
+++ b/src/lisp.h	Fri Dec 23 10:56:16 2011 +0100
@@ -5144,6 +5144,7 @@
 extern Lisp_Object Qdisplay_table;
 extern Lisp_Object Qforeground;
 extern Lisp_Object Qunderline;
+extern Lisp_Object Qflush;
 
 /* Defined in file-coding.c */
 EXFUN (Fcoding_category_list, 0);
--- a/src/redisplay-output.c	Thu Dec 22 15:02:02 2011 +0000
+++ b/src/redisplay-output.c	Fri Dec 23 10:56:16 2011 +0100
@@ -556,6 +556,7 @@
       cdl->ascent != ddl->ascent ||
       cdl->descent != ddl->descent ||
       cdl->clip != ddl->clip ||
+      cdl->clear_findex != ddl->clear_findex ||
       force)
     {
       start_pos = 0;
@@ -788,7 +789,8 @@
 			   cdl->ascent != ddl->ascent ||
 			   cdl->descent != ddl->descent ||
 			   cdl->top_clip != ddl->top_clip ||
-			   cdl->clip != ddl->clip)))
+			   cdl->clip != ddl->clip ||
+			   cdl->clear_findex != ddl->clear_findex)))
 		{
 		  int x, y, width, height;
 		  face_index findex;
@@ -807,8 +809,8 @@
 		    }
 		  else if (x < ddl->bounds.right_in)
 		    {
-		      findex = (ddl->default_findex >= DEFAULT_INDEX) ?
-			ddl->default_findex
+		      findex = (ddl->clear_findex >= DEFAULT_INDEX) ?
+			ddl->clear_findex
 			: DEFAULT_INDEX;
 		    }
 		  else if (x < ddl->bounds.right_out)
@@ -2425,7 +2427,8 @@
 	  else if (cdl->ypos != ddl->ypos ||
 		   cdl->ascent != ddl->ascent ||
 		   cdl->descent != ddl->descent ||
-		   cdl->clip != ddl->clip)
+		   cdl->clip != ddl->clip ||
+		   cdl->clear_findex != ddl->clear_findex)
 	    need_to_clear_bottom = 1;
 
 	  /* #### This kludge is to make sure the modeline shadows get
--- a/src/redisplay.c	Thu Dec 22 15:02:02 2011 +0000
+++ b/src/redisplay.c	Fri Dec 23 10:56:16 2011 +0100
@@ -2186,6 +2186,7 @@
   dl->used_prop_data = 0;
   dl->num_chars = 0;
   dl->line_continuation = 0;
+  dl->clear_findex = DEFAULT_INDEX;
 
   xzero (data);
   data.ef = extent_fragment_new (w->buffer, f);
@@ -2499,6 +2500,12 @@
 	     to the line and end this loop. */
 	  else if (data.ch == '\n')
 	    {
+	      /* Update the clearing face index when the flush property is
+		 set. -- dvl */ 
+	      if ((data.findex > DEFAULT_INDEX)
+		  && WINDOW_FACE_CACHEL_FLUSH_P (w, data.findex))
+		dl->clear_findex = data.findex;
+
 	      /* We aren't going to be adding an end glyph so give its
 		 space back in order to make sure that the cursor can
 		 fit. */
@@ -4690,7 +4697,7 @@
   dl->line_continuation = 0;
 
   /* Set up faces to use for clearing areas, used by output_display_line. */
-  dl->default_findex = default_face;
+  dl->clear_findex = default_face;
   if (default_face > DEFAULT_INDEX)
     {
       dl->left_margin_findex = default_face;
@@ -4931,6 +4938,12 @@
 	     to the line and end this loop. */
 	  else if (data.ch == '\n')
 	    {
+	      /* Update the clearing face index when the flush property is
+		 set. -- dvl */ 
+	      if ((data.findex > DEFAULT_INDEX)
+		  && WINDOW_FACE_CACHEL_FLUSH_P (w, data.findex))
+		dl->clear_findex = data.findex;
+
 	      /* We aren't going to be adding an end glyph so give its
 		 space back in order to make sure that the cursor can
 		 fit. */
@@ -5871,7 +5884,8 @@
 	  || (cdl->cursor_elt == -1 && ddl->cursor_elt != -1)
 	  || old_start != ddl->charpos
 	  || old_end != ddl->end_charpos
-	  || initial_size != Dynarr_length (db->runes))
+	  || initial_size != Dynarr_length (db->runes)
+	  || cdl->clear_findex != ddl->clear_findex)
 	{
 	  return 0;
 	}
@@ -6020,7 +6034,8 @@
 	  || cdl->descent != ddl->descent
 	  || cdl->top_clip != ddl->top_clip
 	  || (cdl->cursor_elt != -1 && ddl->cursor_elt == -1)
-	  || (cdl->cursor_elt == -1 && ddl->cursor_elt != -1))
+	  || (cdl->cursor_elt == -1 && ddl->cursor_elt != -1)
+	  || cdl->clear_findex != ddl->clear_findex)
 	{
 	  return 0;
 	}
--- a/src/redisplay.h	Thu Dec 22 15:02:02 2011 +0000
+++ b/src/redisplay.h	Fri Dec 23 10:56:16 2011 +0100
@@ -322,17 +322,17 @@
   glyph_block_dynarr *left_glyphs;
   glyph_block_dynarr *right_glyphs;
 
-  face_index	left_margin_findex;
-  face_index	right_margin_findex;
-  face_index	default_findex;
+  face_index left_margin_findex;
+  face_index right_margin_findex;
+  face_index clear_findex;
 };
 
-#define DISPLAY_LINE_INIT(dl)			\
-  do						\
-    {						\
-      xzero (dl);				\
-      dl.default_findex = DEFAULT_INDEX;	\
-    }						\
+#define DISPLAY_LINE_INIT(dl)		\
+  do					\
+    {					\
+      xzero (dl);			\
+      dl.clear_findex = DEFAULT_INDEX;	\
+    }					\
   while (0)
 
 #define DISPLAY_LINE_HEIGHT(dl) \