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.
+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:
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
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
<!--
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'
<!--
Private font directory
-->
-<dir>~/misc/fonts</dir>
+<dir>~/.fonts</dir>
<!--
use rgb sub-pixel ordering to improve glyph appearance on
<!--
Load local system customization file
-->
+ <include ignore_missing="yes">conf.d</include>
<include ignore_missing="yes">local.conf</include>
<!--
<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>
#include "fcint.h"
#include <dirent.h>
-static FcBool
+FcBool
FcFileIsDir (const FcChar8 *file)
{
struct stat statb;
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'
#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
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
/* fcdir.c */
+FcBool
+FcFileIsDir (const FcChar8 *file);
+
FcBool
FcFileScanConfig (FcFontSet *set,
FcStrSet *dirs,
#include <stdarg.h>
#include "fcint.h"
+#include <dirent.h>
#ifndef HAVE_XMLPARSE_H
#define HAVE_XMLPARSE_H 0
{
}
+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,
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)