From 2d9c79c049d084c82fdda9a71c5a65502ae94cee Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 5 Dec 2004 05:03:52 +0000 Subject: [PATCH] Change default set of fonts to include all of /usr/X11R6/lib/X11/fonts (or wherever the X fonts are located). Document new directory-name semantics add conf.d Add selectfont to ignore bitmap fonts, add comment for selectfont which accepts bitmap fonts. Allow configuration elements to reference directories. Parse and load all files of the form [0-9]* in sorted order. --- ChangeLog | 18 ++++++++ configure.in | 23 +++++------ doc/fontconfig-user.sgml | 17 ++++---- fonts.conf.in | 1 + local.conf | 23 +++++++++++ src/fcdir.c | 4 +- src/fcint.h | 6 +++ src/fcxml.c | 89 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 158 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index a0424d4..3f8df2b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2004-12-04 Keith Packard + + * 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 directory-name semantics + * fonts.conf.in: + add conf.d + * 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 configuration elements to reference directories. + Parse and load all files of the form [0-9]* in sorted order. + 2004-12-04 Keith Packard * autogen.sh: diff --git a/configure.in b/configure.in index d28c7bf..540abe4 100644 --- a/configure.in +++ b/configure.in @@ -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 diff --git a/doc/fontconfig-user.sgml b/doc/fontconfig-user.sgml index afe1c48..edb3d14 100644 --- a/doc/fontconfig-user.sgml +++ b/doc/fontconfig-user.sgml @@ -264,11 +264,14 @@ is ``~/.fonts.cache-version'', where version is the font file version number (currently 1). <sgmltag>include ignore_missing="no"</> -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. <sgmltag>config</> This element provides a place to consolodate additional configuration @@ -453,8 +456,8 @@ This is an example of a system-wide configuration file <!-- Find fonts in these directories --> -<dir>/usr/X11R6/lib/X11/fonts/truetype</dir> -<dir>/usr/X11R6/lib/X11/fonts/Type1</dir> +<dir>/usr/share/fonts</dir> +<dir>/usr/X11R6/lib/X11/fonts</dir> <!-- 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 <!-- Private font directory --> -<dir>~/misc/fonts</dir> +<dir>~/.fonts</dir> <!-- use rgb sub-pixel ordering to improve glyph appearance on diff --git a/fonts.conf.in b/fonts.conf.in index 32f6a25..4ba79ac 100644 --- a/fonts.conf.in +++ b/fonts.conf.in @@ -211,6 +211,7 @@ + conf.d local.conf + + + + + + false + + + + + diff --git a/src/fcdir.c b/src/fcdir.c index 9ce22da..5c9646f 100644 --- a/src/fcdir.c +++ b/src/fcdir.c @@ -25,7 +25,7 @@ #include "fcint.h" #include -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' diff --git a/src/fcint.h b/src/fcint.h index cf86ad4..2261c1c 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -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- 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, diff --git a/src/fcxml.c b/src/fcxml.c index 52172b2..bb0da1c 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -24,6 +24,7 @@ #include #include "fcint.h" +#include #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) -- 2.39.2