diff src/xfaces.c @ 9184:d50d31da6c8d

(Fset_face_attribute_internal): Mark frame garbaged whenever any face's font or color is changed.
author Richard M. Stallman <rms@gnu.org>
date Thu, 29 Sep 1994 20:25:45 +0000
parents a7947f88d558
children 45bac5feb065
line wrap: on
line diff
--- a/src/xfaces.c	Thu Sep 29 19:37:26 1994 +0000
+++ b/src/xfaces.c	Thu Sep 29 20:25:45 1994 +0000
@@ -995,6 +995,7 @@
   struct frame *f;
   int magic_p;
   int id;
+  int garbaged = 0;
 
   CHECK_FRAME (frame, 0);
   CHECK_NUMBER (face_id, 0);
@@ -1019,18 +1020,23 @@
       face->font = font;
       if (frame_update_line_height (f))
 	x_set_window_size (f, 0, f->width, f->height);
+      /* Must clear cache, since it might contain the font
+	 we just got rid of.  */
+      garbaged = 1;
     }
   else if (EQ (attr_name, intern ("foreground")))
     {
       unsigned long new_color = load_color (f, attr_value);
       unload_color (f, face->foreground);
       face->foreground = new_color;
+      garbaged = 1;
     }
   else if (EQ (attr_name, intern ("background")))
     {
       unsigned long new_color = load_color (f, attr_value);
       unload_color (f, face->background);
       face->background = new_color;
+      garbaged = 1;
     }
 #if 0
   else if (EQ (attr_name, intern ("background-pixmap")))
@@ -1057,16 +1063,13 @@
   if (id == 0 || id == 1)
     recompute_basic_faces (f);
 
-  /* If we're modifying either of the frame's display faces, that
-     means that we're changing the parameters of a fixed face code;
-     since the color/font/whatever is changed but the face ID hasn't,
-     redisplay won't know to redraw the affected sections.  Give it a
-     kick.  */
-  if (id == 0 || id == 1)
+  /* We must redraw the frame whenever any face font or color changes,
+     because it's possible that a merged (display) face
+     contains the font or color we just replaced.
+     And we must inhibit any Expose events until the redraw is done,
+     since they would try to use the invalid display faces.  */
+  if (garbaged)
     SET_FRAME_GARBAGED (f);
-  else
-    /* Otherwise, it's enough to tell it to redisplay the text.  */
-    windows_or_buffers_changed = 1;
 
   return Qnil;
 }