diff src/redisplay.c @ 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 3fde0e346ad7
children 75ad4969a16d
line wrap: on
line diff
--- 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;
 	}