]> code.delx.au - gnu-emacs/blobdiff - src/xfaces.c
* keyboard.c (make_lispy_movement): Deal properly with mouse
[gnu-emacs] / src / xfaces.c
index 2339b57829998d61dce208ebe11551ade94bab44..5638ed65d5f587d0bbda16f0af54c1854cd55cc5 100644 (file)
@@ -1,5 +1,5 @@
 /* "Face" primitives.
-   Copyright (C) 1992, 1993 Free Software Foundation.
+   Copyright (C) 1993 Free Software Foundation.
 
 This file is part of GNU Emacs.
 
@@ -420,7 +420,12 @@ unload_color (f, pixel)
 \f
 /* Initializing face arrays for frames. */
 
-/* Set up faces 0 and 1 based on the normal text and modeline GC's.  */
+/* Set up faces 0 and 1 based on the normal text and modeline GC's.
+   This gets called whenever the parameters stored in the frame itself
+   (i.e. font, background color, etcetera) change.
+
+   Note that the first two faces just contain references to the
+   frame's own resources.  We shouldn't free them.  */
 void
 init_frame_faces (f)
      struct frame *f;
@@ -547,16 +552,32 @@ ensure_face_ready (f, id)
 \f
 /* Computing faces appropriate for a given piece of text in a buffer.  */
 
+/* Return non-zero if FONT1 and FONT2 have the same size bounding box.
+   We assume that they're both character-cell fonts.  */
+static int
+same_size_fonts (font1, font2)
+     XFontStruct *font1, *font2;
+{
+  XCharStruct *bounds1 = &font1->min_bounds;
+  XCharStruct *bounds2 = &font2->min_bounds;
+
+  return (bounds1->width == bounds2->width
+         && bounds1->ascent == bounds2->ascent
+         && bounds1->descent == bounds2->descent);
+}
+
+
 /* Modify face TO by copying from FROM all properties which have
    nondefault settings.  */
 static void 
 merge_faces (from, to)
      struct face *from, *to;
 {
-  if (from->font != (XFontStruct *)FACE_DEFAULT)
-    {
-      to->font = from->font;
-    }
+  /* Only merge the font if it's the same size as the base font.  */
+  if (from->font != (XFontStruct *) FACE_DEFAULT
+      && ! from->font->per_char
+      && same_size_fonts (from->font, to->font))
+    to->font = from->font;
   if (from->foreground != FACE_DEFAULT)
     to->foreground = from->foreground;
   if (from->background != FACE_DEFAULT)