summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2004-12-05 05:03:52 +0000
committerKeith Packard <keithp@keithp.com>2004-12-05 05:03:52 +0000
commit2d9c79c049d084c82fdda9a71c5a65502ae94cee (patch)
treeca4b7072a4d590541f00da42b7a0ae2891d870d6
parent38e528e77673f0395ab802cd1040947e307f0c6c (diff)
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.
-rw-r--r--ChangeLog18
-rw-r--r--configure.in23
-rw-r--r--doc/fontconfig-user.sgml17
-rw-r--r--fonts.conf.in1
-rw-r--r--local.conf23
-rw-r--r--src/fcdir.c4
-rw-r--r--src/fcint.h6
-rw-r--r--src/fcxml.c89
8 files changed, 158 insertions, 23 deletions
diff --git a/ChangeLog b/ChangeLog
index a0424d4..3f8df2b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,23 @@
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:
Report command line for $srcdir/configure accurately.
Bug #212.
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-<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
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 @@
<!--
Load local system customization file
-->
+ <include ignore_missing="yes">conf.d</include>
<include ignore_missing="yes">local.conf</include>
<!--
diff --git a/local.conf b/local.conf
index 73901e1..9f8beee 100644
--- a/local.conf
+++ b/local.conf
@@ -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>
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 <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'
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-<version> file is loaded into
* this data structure. Each directory gets a substructure
@@ -520,6 +523,9 @@ FcDebug (void);
/* fcdir.c */
FcBool
+FcFileIsDir (const FcChar8 *file);
+
+FcBool
FcFileScanConfig (FcFontSet *set,
FcStrSet *dirs,
FcFileCache *cache,
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 <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)