[AC21.5] Fix breakage in xftFont resource for tabs and menubar

Stephen J. Turnbull stephen
Thu Nov 16 21:47:01 EST 2006


APPROVE COMMIT 21.5

Tested on Mac OS X "Tiger".

There have been several reports of problems with Xft font resources
recently.  This patch addresses issues with use of *X resources* to
set Xft fonts for the Tabs and Menubar.  It will not help the others
(including very poor Options Menu and Customize support, and problems
with buffer fonts).

Apparently some experimental work I was doing on creating an Xt
resource converter for Xft fonts leaked into an integration branch.
As part of that work I changed the name of the resource used for Xft
fonts from "xftFont" to "fcFontName", and reserved the xftFont
resource for the (incomplete) automatic converter.

This patch restores the functionality of the "xftFont" resource of the
Tabs and Menubar widgets.  For completeness, I will mention that it
gives precedence to the fcFontName resource, but this is only for my
convenience; this patch should "just work" with properly set xftFont
resources in .Xresources.

I've also changed the default font for Tabs from the absurd Aircut to
Helvetica.  (I'm currently using Bitstream Vera:italic, which is a
nice effect.)

diff --git a/lwlib/ChangeLog b/lwlib/ChangeLog
index 32a1740..1dac37d 100644
--- a/lwlib/ChangeLog
+++ b/lwlib/ChangeLog
@@ -1,3 +1,18 @@
+2006-11-17  Stephen J. Turnbull  <stephen at xemacs.org>
+
+	* xlwmenu.c (xlwMenuResources):
+	* xlwmenu.c (XlwMenuInitialize):
+	* xlwmenuP.h (_XlwMenu_part):
+	* xlwtabs.c (resources):
+	* xlwtabs.c (TabsInit):
+	* xlwtabsP.h (TabsPart):
+	New xftFontName member in each widget part struct, corresponds to
+	xftFont String resource.
+	Initialize renderFont private member from fcFontName if non-NULL,
+	otherwise initialize from xftFontName.
+
+	* xlwtabs.h: Update parameter table.
+
 2006-06-16  Jerry James  <james at xemacs.org>
 
 	* lwlib-Xlw.c (xlw_scrollbar_callback): Do not dereference
diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c
index b6a5110..9445cb8 100644
--- a/lwlib/xlwmenu.c
+++ b/lwlib/xlwmenu.c
@@ -95,11 +95,11 @@ xlwMenuResources[] =
 #ifdef USE_XFT_MENUBARS
   {XtNfcFontName,  XtCFcFontName, XtRString, sizeof (String),
    offset(menu.fcFontName), 
-   XtRString, (XtPointer) "Helvetica-12:bold"},
+   XtRString, (XtPointer) NULL},
   /* #### This needs to be fixed to give a proper type and converter for
      XftFonts.  See also xlwtabs.c. */
-  {XtNxftFont, XtCXftFont, XtRPointer, sizeof(XtPointer),
-	offset(menu.renderFont), XtRPointer, (XtPointer) NULL },
+  {XtNxftFont, XtCXftFont, XtRString, sizeof(XtPointer),
+	offset(menu.xftFontName), XtRString, (XtPointer) "Helvetica-12:bold" },
 #endif
 # ifdef USE_XFONTSET
   /* #### Consider using the same method as for Motif; see the comment in
@@ -3241,6 +3241,9 @@ XlwMenuInitialize (Widget UNUSED (reques
 #endif
 
 #ifdef USE_XFT_MENUBARS
+  /* #### kludge for name change */
+  if (!mw->menu.fcFontName)
+    mw->menu.fcFontName = mw->menu.xftFontName;
   /* to do this right, we should add a new Xt Resource type +
      conversion function
   */
diff --git a/lwlib/xlwmenuP.h b/lwlib/xlwmenuP.h
index b14fde9..b091399 100644
--- a/lwlib/xlwmenuP.h
+++ b/lwlib/xlwmenuP.h
@@ -35,6 +35,7 @@ typedef struct _XlwMenu_part
   XFontStruct *	font;
 #ifdef USE_XFT_MENUBARS
   String fcFontName;
+  String xftFontName;
   XftFont *renderFont;
 #endif
 # ifdef USE_XFONTSET
diff --git a/lwlib/xlwtabs.c b/lwlib/xlwtabs.c
index b13f0b4..e99ee61 100644
--- a/lwlib/xlwtabs.c
+++ b/lwlib/xlwtabs.c
@@ -153,11 +153,11 @@ static XtResource resources[] = {
   /* #### Maybe use "-*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1" here?
      or XtDefaultFont? */
   {XtNfcFontName, XtCFcFontName, XtRString, sizeof(String),
-	offset(fcFontName), XtRString, (XtPointer) "AirCut-16" },
+	offset(fcFontName), XtRString, (XtPointer) NULL },
   /* #### This needs to be fixed to give a proper type and converter for
      XftFonts.  See also xlwmenu.c. */
-  {XtNxftFont, XtCXftFont, XtRPointer, sizeof(XtPointer),
-	offset(renderFont), XtRPointer, (XtPointer) NULL },
+  {XtNxftFont, XtCXftFont, XtRString, sizeof(String),
+	offset(xftFontName), XtRString, (XtPointer) "Helvetica-12" },
 #endif
   {XtNinternalWidth, XtCWidth, XtRDimension, sizeof(Dimension),
 	offset(internalWidth), XtRImmediate, (XtPointer)4 },
@@ -479,10 +479,12 @@ TabsInit(Widget request, Widget new_, Ar
     newTw->tabs.tab_height = 2 * newTw->tabs.internalHeight + SHADWID ;
 
 #ifdef USE_XFT_TABS
+    /* #### kludge for name change */
+    if (!newTw->tabs.fcFontName)
+      newTw->tabs.fcFontName = newTw->tabs.xftFontName;
     /* must get font here
-       to do this right, we should add a new Xt Resource type +
-       conversion function
-    */
+       #### to do this right, we should add a new Xt Resource type +
+       conversion function */
     newTw->tabs.renderFont =
       xft_open_font_by_name (XtDisplay ((Widget) newTw),
 			     newTw->tabs.fcFontName);
diff --git a/lwlib/xlwtabs.h b/lwlib/xlwtabs.h
index 3216556..3f9694c 100644
--- a/lwlib/xlwtabs.h
+++ b/lwlib/xlwtabs.h
@@ -44,8 +44,8 @@
  Name		     Class		RepType		Default Value
  ----		     -----		-------		-------------
  font		     Font		XFontStruct*	XtDefaultFont
- fcFontName          FcFontName         String          AirCut-16 *0
- xftFont             XftFont            XtPointer       NULL      *8
+ fcFontName          FcFontName         String          NULL      *0
+ xftFont             XftFont            String          Helvetica-12 *8
  internalWidth	     Width		Dimension	4	  *1
  internalHeight	     Height		Dimension	2	  *1
  topWidget	     TopWidget		Widget			  *2
diff --git a/lwlib/xlwtabsP.h b/lwlib/xlwtabsP.h
index 9bc6e44..b99c9b2 100644
--- a/lwlib/xlwtabsP.h
+++ b/lwlib/xlwtabsP.h
@@ -76,6 +76,7 @@ typedef struct {
 #ifdef USE_XFT_TABS
     XftFont	*renderFont;
     String	fcFontName;
+    String	xftFontName;
 #endif
     Dimension   internalHeight, internalWidth ;
     Widget	topWidget ;
diff --git a/man/ChangeLog b/man/ChangeLog
index ed67b60..f53bd76 100644
--- a/man/ChangeLog
+++ b/man/ChangeLog
@@ -1,3 +1,11 @@
+2006-11-16  Stephen J. Turnbull  <stephen at xemacs.org>
+
+	* internals/internals.texi
+	(Better Rendering Support -- Configuration with the Interim Patches):
+	Fix examples of configuration via X resources.
+	(Better Rendering Support -- Implementation): Fix description of
+	xftFont resources, introduce fcFontName resource.
+
 2006-11-11  Aidan Kehoe  <kehoea at parhasard.net>
 
 	* lispref/faces.texi (Face Convenience Functions):
diff --git a/man/internals/internals.texi b/man/internals/internals.texi
index 2f0df88..ca61879 100644
--- a/man/internals/internals.texi
+++ b/man/internals/internals.texi
@@ -27629,12 +27629,16 @@ of @file{Xft}'s rendering functionality
 
 @item fontconfig
 Fontconfig is dramatically different from the X model in several ways.
-In particular, @emph{fontconfig always returns a font}.  However, the
+In particular, for the convenient interface @emph{fontconfig always
+returns a font}.  However, the
 font returned need not be anything like the desired font.  This means
 that XEmacs must adopt a strategy of delegating the search to
 fontconfig, then sanity-checking the return, rather than trying to use
 the fontconfig API to search using techniques appropriate for the X11
-core font API.
+core font API.  (This isn't actually true.  fontconfig has more complex
+interfaces which allow listing a subset of fonts that match a pattern,
+and don't go out of their may to return something no matter what.  But
+the original patches didn't use this approach.)
 
 @item Font menus
 The @samp{Options->Font} and @samp{Options->Font Sizes} menus are
@@ -27647,17 +27651,20 @@ the size is strange.  And the @samp{Opti
 disabled, and has been for eons.
 
 @item X resources
-Currently in Stephen's patch there are @emph{four} treatments of font
+Currently in Stephen's patch there are @emph{five} treatments of font
 resources.  There are the @samp{XEmacs. at var{face}.attributeFont}
 resources used to set a single global font specification.  In the
 widgets, some (still) have a @samp{font} resource using the automatic
 @file{Xt} resource conversion to @samp{FontStruct}, some have separate
- at samp{font} and @samp{xftFont} resources with the former automatically
+ at samp{font} and @samp{fcFontName} resources with the former automatically
 converted to @samp{FontStruct} by @file{Xt} and the latter left as a
-string, to be converted by @samp{XftParseName} later, and some have a
+string, to be converted by @samp{FcParseName} later, and some have a
 single @samp{font} resource which is converted to @samp{FontStruct} by
 @file{Xt} or the latter left as a string, depending on whether
- at file{Xft} was enabled by @samp{configure} or not.
+ at file{Xft} was enabled by @samp{configure} or not.  There is also the
+ at samp{xftFont} resource which may be retargeted to use an Xt converter
+function, but currently simply just an alias for the @samp{fcFontName}
+resource.
 
 Stephen thinks that all of these should be converted to use the face
 approach, perhaps with some way to set specifications for individual
@@ -27894,8 +27901,12 @@ at best.  Probably we will should to a s
 this resource, and convert to a face in XEmacs rather than a font in
 Xt/Xft.
 @example
-XEmacs*Tabs.xftFont: Bitstream Vera Sans-16
-XEmacs*menubar*xftFont: Bitstream Vera Sans-16
+! DEPRECATED resource xftFont.
+! To be retargeted to an Xt converter which returns a font.
+!XEmacs*Tabs.xftFont: Bitstream Vera Sans-16
+!XEmacs*menubar*xftFont: Bitstream Vera Sans-16
+XEmacs*Tabs.fcFontName: Bitstream Vera Sans-16
+XEmacs*menubar*fcFontName: Bitstream Vera Sans-16
 XEmacs.modeline.attributeFont: Bitstream Charter-16
 XEmacs.default.attributeFont: Bitstream Vera Sans Mono-16
 @end example
@@ -27903,7 +27914,14 @@ I highly recommend use of a proportional
 allows a lot more text to fit there.  (Previously the font sizes were
 quite varied, and there was a comment that this weirdness gave good
 balance.  This isn't true on my main platform, Mac OS X, and needs to be
-rechecked on Linux, where it was observed.)
+rechecked on Linux, where it was observed.)  Note that you can probably
+specify a particular Japanese font with something like
+ at example
+XEmacs.default.attributeFont: Bitstream Vera Sans Mono,Sazanami Mincho-16
+ at end example
+Order is important; Japanese fonts will support English, but Sazanami's
+Roman characters are not very pretty compared to the Bitstream font.
+ at strong{Note:} @emph{This is untested, but should work in theory.}
 @end itemize
 
 


**** End of patch



More information about the XEmacs-Beta mailing list