Change default set of fonts to include all of /usr/X11R6/lib/X11/fonts (or

wherever the X fonts are located).
Document new <include>directory-name</include> semantics
add <include ignore_missing="yes">conf.d</include>
Add selectfont to ignore bitmap fonts, add comment for selectfont which
    accepts bitmap fonts.
Allow <include> configuration elements to reference directories. Parse and
    load all files of the form [0-9]* in sorted order.
This commit is contained in:
Keith Packard 2004-12-05 05:03:52 +00:00
parent 38e528e776
commit 2d9c79c049
8 changed files with 158 additions and 23 deletions

View File

@ -1,3 +1,21 @@
2004-12-04 Keith Packard <keithp@keithp.com>
* configure.in:
Change default set of fonts to include all of
/usr/X11R6/lib/X11/fonts (or wherever the X fonts are located).
* doc/fontconfig-user.sgml:
Document new <include>directory-name</include> semantics
* fonts.conf.in:
add <include ignore_missing="yes">conf.d</include>
* local.conf:
Add selectfont to ignore bitmap fonts, add comment for
selectfont which accepts bitmap fonts.
* src/fcdir.c:
* src/fcint.h:
* src/fcxml.c: (FcConfigParseAndLoadDir), (FcConfigParseAndLoad):
Allow <include> configuration elements to reference directories.
Parse and load all files of the form [0-9]* in sorted order.
2004-12-04 Keith Packard <keithp@keithp.com>
* autogen.sh:

View File

@ -281,19 +281,16 @@ yes)
for dir in /usr/X11R6/lib/X11 /usr/X11/lib/X11 /usr/lib/X11; do
case x"$FC_ADD_FONTS" in
x)
if test -d "$dir/fonts"; then
for sub in "$dir"/fonts/*; do
if ls "$sub" | grep -q -i '\.pf\|\.tt\|\.ot'; then
case x$FC_ADD_FONTS in
x)
FC_ADD_FONTS="$sub"
;;
*)
FC_ADD_FONTS="$FC_ADD_FONTS,$sub"
;;
esac
fi
done
sub="$dir/fonts"
if test -d "$sub"; then
case x$FC_ADD_FONTS in
x)
FC_ADD_FONTS="$sub"
;;
*)
FC_ADD_FONTS="$FC_ADD_FONTS,$sub"
;;
esac
fi
;;
esac

View File

@ -264,11 +264,14 @@ is ``~/.fonts.cache-<sgmltag>version</>'', where <sgmltag>version</> is the font
file version number (currently 1).
</para></refsect2>
<refsect2><title><sgmltag>include ignore_missing="no"</></title><para>
This element contains the name of an additional configuration file. When
the XML datatype is traversed by FcConfigParse, the contents of the file
will also be incorporated into the configuration by passing the filename to
This element contains the name of an additional configuration file or
directory. If a directory, every file within that directory starting with a
number will be processed in sorted order. When
the XML datatype is traversed by FcConfigParse, the contents of the file(s)
will also be incorporated into the configuration by passing the filename(s) to
FcConfigLoadAndParse. If 'ignore_missing' is set to "yes" instead of the
default "no", a missing file will elicit no warning message from the library.
default "no", a missing file or directory will elicit no warning message from
the library.
</para></refsect2>
<refsect2><title><sgmltag>config</></title><para>
This element provides a place to consolodate additional configuration
@ -453,8 +456,8 @@ This is an example of a system-wide configuration file
&lt;!--
Find fonts in these directories
--&gt;
&lt;dir&gt;/usr/X11R6/lib/X11/fonts/truetype&lt;/dir&gt;
&lt;dir&gt;/usr/X11R6/lib/X11/fonts/Type1&lt;/dir&gt;
&lt;dir&gt;/usr/share/fonts&lt;/dir&gt;
&lt;dir&gt;/usr/X11R6/lib/X11/fonts&lt;/dir&gt;
&lt;!--
Accept deprecated 'mono' alias, replacing it with 'monospace'
@ -535,7 +538,7 @@ This is an example of a per-user configuration file that lives in
&lt;!--
Private font directory
--&gt;
&lt;dir&gt;~/misc/fonts&lt;/dir&gt;
&lt;dir&gt;~/.fonts&lt;/dir&gt;
&lt;!--
use rgb sub-pixel ordering to improve glyph appearance on

View File

@ -211,6 +211,7 @@
<!--
Load local system customization file
-->
<include ignore_missing="yes">conf.d</include>
<include ignore_missing="yes">local.conf</include>
<!--

View File

@ -11,4 +11,27 @@
<edit name="rgba" mode="assign"><const>rgb</const></edit>
</match>
-->
<!--
Reject bitmap fonts
-->
<selectfont>
<rejectfont>
<pattern>
<patelt name="scalable"><bool>false</bool></patelt>
</pattern>
</rejectfont>
</selectfont>
<!--
Accept bitmap fonts. This overrides any rejectfont which matches
<selectfont>
<acceptfont>
<pattern>
<patelt name="scalable"><bool>false</bool></patelt>
</pattern>
</acceptfont>
</selectfont>
-->
</fontconfig>

View File

@ -25,7 +25,7 @@
#include "fcint.h"
#include <dirent.h>
static FcBool
FcBool
FcFileIsDir (const FcChar8 *file)
{
struct stat statb;
@ -166,8 +166,6 @@ FcFileScan (FcFontSet *set,
return FcFileScanConfig (set, dirs, cache, blanks, file, force, 0);
}
#define FC_MAX_FILE_LEN 4096
/*
* Scan 'dir', adding font files to 'set' and
* subdirectories to 'dirs'

View File

@ -69,6 +69,7 @@ typedef struct _FcSymbolic {
#define FC_DBG_SCAN 128
#define FC_DBG_SCANV 256
#define FC_DBG_MEMORY 512
#define FC_DBG_CONFIG 1024
#define FC_MEM_CHARSET 0
#define FC_MEM_CHARLEAF 1
@ -229,6 +230,8 @@ typedef struct _FcGlyphName {
FcChar8 name[1]; /* name extends beyond struct */
} FcGlyphName;
#define FC_MAX_FILE_LEN 4096
/*
* The per-user ~/.fonts.cache-<version> file is loaded into
* this data structure. Each directory gets a substructure
@ -519,6 +522,9 @@ FcDebug (void);
/* fcdir.c */
FcBool
FcFileIsDir (const FcChar8 *file);
FcBool
FcFileScanConfig (FcFontSet *set,
FcStrSet *dirs,

View File

@ -24,6 +24,7 @@
#include <stdarg.h>
#include "fcint.h"
#include <dirent.h>
#ifndef HAVE_XMLPARSE_H
#define HAVE_XMLPARSE_H 0
@ -2077,6 +2078,84 @@ FcEndDoctypeDecl (void *userData)
{
}
static FcBool
FcConfigParseAndLoadDir (FcConfig *config,
const FcChar8 *name,
const FcChar8 *dir,
FcBool complain)
{
DIR *d;
struct dirent *e;
FcBool ret = FcTrue;
FcChar8 *file;
FcChar8 *base;
FcStrSet *files;
d = opendir ((char *) dir);
if (!d)
{
if (complain)
FcConfigMessage (0, FcSevereError, "Cannot open config dir \"%s\"",
name);
ret = FcFalse;
goto bail0;
}
/* freed below */
file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + FC_MAX_FILE_LEN + 1);
if (!file)
{
ret = FcFalse;
goto bail1;
}
strcpy ((char *) file, (char *) dir);
strcat ((char *) file, "/");
base = file + strlen ((char *) file);
files = FcStrSetCreate ();
if (!files)
{
ret = FcFalse;
goto bail2;
}
if (FcDebug () & FC_DBG_CONFIG)
printf ("\tScanning config dir %s\n", dir);
while (ret && (e = readdir (d)))
{
/*
* Add all files of the form [0-9]*
*/
if ('0' <= e->d_name[0] && e->d_name[0] <= '9' &&
strlen (e->d_name) < FC_MAX_FILE_LEN)
{
strcpy ((char *) base, (char *) e->d_name);
if (!FcStrSetAdd (files, file))
{
ret = FcFalse;
goto bail3;
}
}
}
if (ret)
{
int i;
qsort (files->strs, files->num, sizeof (FcChar8 *),
(int (*)(const void *, const void *)) FcStrCmp);
for (i = 0; ret && i < files->num; i++)
ret = FcConfigParseAndLoad (config, files->strs[i], complain);
}
bail3:
FcStrSetDestroy (files);
bail2:
free (file);
bail1:
closedir (d);
bail0:
return ret || !complain;
}
FcBool
FcConfigParseAndLoad (FcConfig *config,
const FcChar8 *name,
@ -2101,6 +2180,16 @@ FcConfigParseAndLoad (FcConfig *config,
goto bail0;
}
if (FcFileIsDir (filename))
{
FcBool ret = FcConfigParseAndLoadDir (config, name, filename, complain);
FcStrFree (filename);
return ret;
}
if (FcDebug () & FC_DBG_CONFIG)
printf ("\tLoading config file %s\n", filename);
f = fopen ((char *) filename, "r");
FcStrFree (filename);
if (!f)