changeset 3076:e3b3c67cf203

Arrange for font names to get fully resolved - no wildcards. * xfns.c (x_set_frame_parameters): Store the value in the frame parameter alist before we call the setter function, so the setter function can touch up the value if it chooses. (x_set_foreground_color, x_set_background_color): Call recompute_basic_faces, so their GC's will reflect the changes. (x_new_font): Add extern declaration - this returns a Lisp_Object now, the fully resolved font name. (x_set_font): Accept the fully resolved name from x_new_font, and put it in the frame's parameter alist. Call recompute_basic_faces. * xterm.c (x_new_font): Return the fully resolved font name, Qnil (if no match), or Qt (match, but unacceptable metrics). * xterm.c (x_new_font): Don't call init_frame_faces. * xterm.h: New section for declarations for xfaces.c. (init_frame_faces, free_frame_faces, intern_face, face_name_id_number, same_size_fonts, recompute_basic_faces, compute_char_face, compute_glyph_face): Declare these here. * xfaces.c (same_size_fonts): We can now remove this extern declaration. * xfns.c (face_name_id_number): Likewise. * xterm.c (intern_face): Likewise. * xterm.c (dumpglyphs): Remember that the default faces can have null fonts, too.
author Jim Blandy <jimb@redhat.com>
date Tue, 25 May 1993 14:04:12 +0000
parents 878381e48b0d
children 8bba60752a32
files src/xterm.c
diffstat 1 files changed, 42 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/src/xterm.c	Tue May 25 14:03:41 1993 +0000
+++ b/src/xterm.c	Tue May 25 14:04:12 1993 +0000
@@ -423,8 +423,6 @@
   register Lisp_Object *tbase = GLYPH_TABLE_BASE;
   Window window = FRAME_X_WINDOW (f);
 
-  extern struct face *intern_face (/* FRAME_PTR, struct face * */);
-
   while (n > 0)
     {
       /* Get the face-code of the next GLYPH.  */
@@ -492,31 +490,38 @@
 #define FACE_DEFAULT (~0)
 
 	/* Now override that if the cursor's on this character.  */
-	if (hl == 2 && (defaulted
-			|| !(face->font && (int) face->font != FACE_DEFAULT)))
-	  {
-	    gc = f->display.x->cursor_gc;
-	  }
-	/* Cursor on non-default face: must merge.  */
-	else if (hl == 2)
+	if (hl == 2)
 	  {
-	    XGCValues xgcv;
-	    unsigned long mask;
-
-	    xgcv.background = f->display.x->cursor_pixel;
-	    xgcv.foreground = f->display.x->cursor_foreground_pixel;
-	    xgcv.font = face->font->fid;
-	    xgcv.graphics_exposures = 0;
-	    mask = GCForeground | GCBackground | GCFont | GCGraphicsExposures;
-	    gc = XCreateGC (x_current_display, FRAME_X_WINDOW (f),
-			    mask, &xgcv);
+	    if (defaulted
+		|| !face->font
+		|| (int) face->font == FACE_DEFAULT)
+	      {
+		gc = f->display.x->cursor_gc;
+	      }
+	    /* Cursor on non-default face: must merge.  */
+	    else
+	      {
+		XGCValues xgcv;
+		unsigned long mask;
+
+		xgcv.background = f->display.x->cursor_pixel;
+		xgcv.foreground = f->display.x->cursor_foreground_pixel;
+		xgcv.font = face->font->fid;
+		xgcv.graphics_exposures = 0;
+		mask = GCForeground | GCBackground | GCFont | GCGraphicsExposures;
+		gc = XCreateGC (x_current_display, FRAME_X_WINDOW (f),
+				mask, &xgcv);
 #if 0
-	    if (face->stipple && face->stipple != FACE_DEFAULT)
-	      XSetStipple (x_current_display, gc, face->stipple);
+		if (face->stipple && face->stipple != FACE_DEFAULT)
+		  XSetStipple (x_current_display, gc, face->stipple);
 #endif
-	    gc_temporary = 1;
+		gc_temporary = 1;
+	      }
 	  }
 
+	if ((int) font == FACE_DEFAULT)
+	  font = f->display.x->font;
+
 	XDrawImageString (x_current_display, window, gc,
 			  left, top + FONT_BASE (font), buf, len);
 
@@ -3891,11 +3896,11 @@
    0 <= n_fonts <= x_font_table_size.  */
 static int n_fonts;
 
+Lisp_Object
 x_new_font (f, fontname)
      struct frame *f;
      register char *fontname;
 {
-  XFontStruct *temp;
   int already_loaded;
   int n_matching_fonts;
   XFontStruct *font_info;
@@ -3911,7 +3916,7 @@
   /* If the server couldn't find any fonts whose named matched fontname,
      return an error code.  */
   if (n_matching_fonts == 0)
-    return 1;
+    return Qnil;
 
   /* See if we've already loaded a matching font. */
   {
@@ -3923,6 +3928,7 @@
 	if (x_font_table[i]->fid == font_info[j].fid)
 	  {
 	    already_loaded = i;
+	    fontname = font_names[j];
 	    goto found_font;
 	  }
   }
@@ -3949,13 +3955,13 @@
 #endif
 
       if (i >= n_matching_fonts)
-	return 2;
+	return Qt;
       else
 	fontname = font_names[i];
 
       font = (XFontStruct *) XLoadQueryFont (x_current_display, fontname);
       if (! font)
-	return 1;
+	return Qnil;
 
       /* Do we need to create the table?  */
       if (x_font_table_size == 0)
@@ -3978,10 +3984,6 @@
       f->display.x->font = x_font_table[n_fonts++] = font;
     }
   
-  /* Free the information from XListFontsWithInfo.  The data
-     we actually retain comes from XLoadQueryFont.  */
-  XFreeFontInfo (font_names, font_info, n_matching_fonts);
-
   /* Now make the frame display the given font.  */
   if (FRAME_X_WINDOW (f) != 0)
     {
@@ -3991,12 +3993,20 @@
 		f->display.x->font->fid);
       XSetFont (x_current_display, f->display.x->cursor_gc,
 		f->display.x->font->fid);
-      init_frame_faces (f);
 
       x_set_window_size (f, f->width, f->height);
     }
 
-  return 0;
+  {
+    Lisp_Object lispy_name = build_string (fontname);
+
+
+    /* Free the information from XListFontsWithInfo.  The data
+       we actually retain comes from XLoadQueryFont.  */
+    XFreeFontInfo (font_names, font_info, n_matching_fonts);
+
+    return lispy_name;
+  }
 }
 #else /* ! defined (HAVE_X11) */
 x_new_font (f, newname)