Commit 8c255fb1 authored by Akira TAGOH's avatar Akira TAGOH

Bug 20411 - fontconfig doesn't match FreeDesktop directories specs

Allows reading configuration files, fonts and cache files from
the directories where the XDG Base Directory Specification defines.

the old directories are still in the configuration files for
the backward compatibility.
parent bc4517d8
......@@ -2,6 +2,9 @@
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- Load per-user customization file -->
<include ignore_missing="yes">~/.fonts.conf.d</include>
<include ignore_missing="yes">~/.fonts.conf</include>
<include ignore_missing="yes" prefix="xdg">fontconfig/conf.d</include>
<include ignore_missing="yes" prefix="xdg">fontconfig/fonts.conf</include>
<!-- the following elements will be removed in the future -->
<include ignore_missing="yes" deprecated="yes">~/.fonts.conf.d</include>
<include ignore_missing="yes" deprecated="yes">~/.fonts.conf</include>
</fontconfig>
......@@ -37,6 +37,8 @@
&confdir;/fonts.conf
&confdir;/fonts.dtd
&confdir;/conf.d
$XDG_CONFIG_HOME/fontconfig/conf.d
$XDG_CONFIG_HOME/fontconfig/fonts.conf
~/.fonts.conf.d
~/.fonts.conf
</synopsis>
......@@ -299,21 +301,22 @@ following structure:
This is the top level element for a font configuration and can contain
<literal>&lt;dir&gt;</literal>, <literal>&lt;cachedir&gt;</literal>, <literal>&lt;include&gt;</literal>, <literal>&lt;match&gt;</literal> and <literal>&lt;alias&gt;</literal> elements in any order.
</para></refsect2>
<refsect2><title><literal>&lt;dir&gt;</literal></title><para>
<refsect2><title><literal>&lt;dir prefix="default"&gt;</literal></title><para>
This element contains a directory name which will be scanned for font files
to include in the set of available fonts.
to include in the set of available fonts. If 'prefix' is set to "xdg", the value in the XDG_DATA_HOME environment variable will be added as the path prefix. please see XDG Base Directory Specification for more details.
</para></refsect2>
<refsect2><title><literal>&lt;cachedir&gt;</literal></title><para>
<refsect2><title><literal>&lt;cachedir prefix="default"&gt;</literal></title><para>
This element contains a directory name that is supposed to be stored or read
the cache of font information. If multiple elements are specified in
the configuration file, the directory that can be accessed first in the list
will be used to store the cache files. If it starts with '~', it refers to
a directory in the users home directory. The default directory is ``~/.fontconfig''
and it contains the cache files named ``<literal>&lt;hash value&gt;</literal>-<literal>&lt;architecture&gt;</literal>.cache-<literal>&lt;version</literal>'',
a directory in the users home directory. If 'prefix' is set to "xdg", the value in the XDG_CACHE_HOME environment variable will be added as the path prefix. please see XDG Base Directory Specification for more details.
The default directory is ``$XDG_CACHE_HOME/fontconfig'' and it contains the cache files
named ``<literal>&lt;hash value&gt;</literal>-<literal>&lt;architecture&gt;</literal>.cache-<literal>&lt;version</literal>'',
where <literal>&lt;version&gt;</literal> is the font configureation file
version number (currently 3).
</para></refsect2>
<refsect2><title><literal>&lt;include ignore_missing="no"&gt;</literal></title><para>
<refsect2><title><literal>&lt;include ignore_missing="no" prefix="default"&gt;</literal></title><para>
This element contains the name of an additional configuration file or
directory. If a directory, every file within that directory starting with an
ASCII digit (U+0030 - U+0039) and ending with the string ``.conf'' will be processed in sorted order. When
......@@ -321,7 +324,7 @@ 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 or directory will elicit no warning message from
the library.
the library. If 'prefix' is set to "xdg", the value in the XDG_CONFIG_HOME environment variable will be added as the path prefix. please see XDG Base Directory Specification for more details.
</para></refsect2>
<refsect2><title><literal>&lt;config&gt;</literal></title><para>
This element provides a place to consolidate additional configuration
......@@ -577,7 +580,7 @@ This is an example of a system-wide configuration file
Load per-user customization file, but don't complain
if it doesn't exist
--&gt;
&lt;include ignore_missing="yes"&gt;~/.fonts.conf&lt;/include&gt;
&lt;include ignore_missing="yes" prefix="xdg"&gt;fontconfig/fonts.conf&lt;/include&gt;
&lt;!--
Load local customization files, but don't complain
......@@ -630,18 +633,18 @@ This is an example of a system-wide configuration file
<refsect2><title>User configuration file</title>
<para>
This is an example of a per-user configuration file that lives in
~/.fonts.conf
$XDG_CONFIG_HOME/fontconfig/fonts.conf
</para>
<programlisting>
&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE fontconfig SYSTEM "fonts.dtd"&gt;
&lt;!-- ~/.fonts.conf for per-user font configuration --&gt;
&lt;!-- $XDG_CONFIG_HOME/fontconfig/fonts.conf for per-user font configuration --&gt;
&lt;fontconfig&gt;
&lt;!--
Private font directory
--&gt;
&lt;dir&gt;~/.fonts&lt;/dir&gt;
&lt;dir prefix="xdg"&gt;fonts&lt;/dir&gt;
&lt;!--
use rgb sub-pixel ordering to improve glyph appearance on
......@@ -677,20 +680,20 @@ format. The master fonts.conf file references this directory in an
is a DTD that describes the format of the configuration files.
</para>
<para>
<emphasis>~/.fonts.conf.d</emphasis>
<emphasis>$XDG_CONFIG_HOME/fontconfig/conf.d</emphasis> and <emphasis>~/.fonts.conf.d</emphasis>
is the conventional name for a per-user directory of (typically
auto-generated) configuration files, although the
actual location is specified in the global fonts.conf file.
actual location is specified in the global fonts.conf file. please note that ~/.fonts.conf.d is deprecated now. it will not be read by default in the future version.
</para>
<para>
<emphasis>~/.fonts.conf</emphasis>
<emphasis>$XDG_CONFIG_HOME/fontconfig/fonts.conf</emphasis> and <emphasis>~/.fonts.conf</emphasis>
is the conventional location for per-user font configuration, although the
actual location is specified in the global fonts.conf file.
actual location is specified in the global fonts.conf file. please note that ~/.fonts.conf is deprecated now. it will not be read by default in the future version.
</para>
<para>
<emphasis> ~/.fontconfig/*.cache-*</emphasis>
<emphasis>$XDG_CACHE_HOME/fontconfig/*.cache-*</emphasis> and <emphasis> ~/.fontconfig/*.cache-*</emphasis>
is the conventional repository of font information that isn't found in the
per-directory caches. This file is automatically maintained by fontconfig.
per-directory caches. This file is automatically maintained by fontconfig. please note that ~/.fontconfig/*.cache-* is deprecated now. it will not be read by default in the future version.
</para>
</refsect1>
<refsect1><title>Environment variables</title>
......
......@@ -25,6 +25,8 @@
<dir>@FC_DEFAULT_FONTS@</dir>
@FC_FONTPATH@
<dir prefix="xdg">fonts</dir>
<!-- the following element will be removed in the future -->
<dir>~/.fonts</dir>
<!--
......@@ -71,6 +73,8 @@
<!-- Font cache directory list -->
<cachedir>@FC_CACHEDIR@</cachedir>
<cachedir prefix="xdg">fontconfig</cachedir>
<!-- the following element will be removed in the future -->
<cachedir>~/.fontconfig</cachedir>
<config>
......
......@@ -12,7 +12,9 @@
Add a directory that provides fonts
-->
<!ELEMENT dir (#PCDATA)>
<!ATTLIST dir xml:space (default|preserve) 'preserve'>
<!ATTLIST dir
prefix (#PCDATA) "default"
xml:space (default|preserve) 'preserve'>
<!--
Define the per-user file that holds cache font information.
......@@ -33,7 +35,9 @@
home directory path.
-->
<!ELEMENT cachedir (#PCDATA)>
<!ATTLIST cachedir xml:space (default|preserve) 'preserve'>
<!ATTLIST cachedir
prefix (#PCDATA) "default"
xml:space (default|preserve) 'preserve'>
<!--
Reference another configuration file; note that this
......@@ -48,6 +52,8 @@
<!ELEMENT include (#PCDATA)>
<!ATTLIST include
ignore_missing (no|yes) "no"
prefix (#PCDATA) "default"
deprecated (#PCDATA) "no"
xml:space (default|preserve) "preserve">
<!--
......
......@@ -1837,6 +1837,81 @@ FcConfigHome (void)
return 0;
}
FcChar8 *
FcConfigXdgCacheHome (void)
{
const char *env = getenv ("XDG_CACHE_HOME");
FcChar8 *ret = NULL;
if (env)
ret = FcStrCopy ((const FcChar8 *)env);
else
{
const FcChar8 *home = FcConfigHome ();
size_t len = home ? strlen ((const char *)home) : 0;
ret = malloc (len + 7 + 1);
if (ret)
{
memcpy (ret, home, len);
memcpy (&ret[len], FC_DIR_SEPARATOR_S ".cache", 7);
ret[len + 7] = 0;
}
}
return ret;
}
FcChar8 *
FcConfigXdgConfigHome (void)
{
const char *env = getenv ("XDG_CONFIG_HOME");
FcChar8 *ret = NULL;
if (env)
ret = FcStrCopy ((const FcChar8 *)env);
else
{
const FcChar8 *home = FcConfigHome ();
size_t len = home ? strlen ((const char *)home) : 0;
ret = malloc (len + 8 + 1);
if (ret)
{
memcpy (ret, home, len);
memcpy (&ret[len], FC_DIR_SEPARATOR_S ".config", 8);
ret[len + 8] = 0;
}
}
return ret;
}
FcChar8 *
FcConfigXdgDataHome (void)
{
const char *env = getenv ("XDG_DATA_HOME");
FcChar8 *ret = NULL;
if (env)
ret = FcStrCopy ((const FcChar8 *)env);
else
{
const FcChar8 *home = FcConfigHome ();
size_t len = home ? strlen ((const char *)home) : 0;
ret = malloc (len + 13 + 1);
if (ret)
{
memcpy (ret, home, len);
memcpy (&ret[len], FC_DIR_SEPARATOR_S ".local" FC_DIR_SEPARATOR_S "share", 13);
ret[len + 13] = 0;
}
}
return ret;
}
FcBool
FcConfigEnableHome (FcBool enable)
{
......@@ -1883,7 +1958,7 @@ FcConfigFilename (const FcChar8 *url)
default:
path = FcConfigGetPath ();
if (!path)
return 0;
return NULL;
for (p = path; *p; p++)
{
file = FcConfigFileExists (*p, url);
......@@ -1893,6 +1968,7 @@ FcConfigFilename (const FcChar8 *url)
FcConfigFreePath (path);
break;
}
return file;
}
......
......@@ -72,21 +72,37 @@ FcInitLoadConfig (void)
if (config->cacheDirs && config->cacheDirs->num == 0)
{
FcChar8 *prefix;
size_t plen;
fprintf (stderr,
"Fontconfig warning: no <cachedir> elements found. Check configuration.\n");
fprintf (stderr,
"Fontconfig warning: adding <cachedir>%s</cachedir>\n",
FC_CACHEDIR);
prefix = FcConfigXdgCacheHome ();
plen = prefix ? strlen ((const char *)prefix) : 0;
if (!prefix)
goto bail;
prefix = realloc (prefix, plen + 12);
if (!prefix)
goto bail;
memcpy (&prefix[plen], FC_DIR_SEPARATOR_S "fontconfig", 11);
prefix[plen + 11] = 0;
fprintf (stderr,
"Fontconfig warning: adding <cachedir>~/.fontconfig</cachedir>\n");
"Fontconfig warning: adding <cachedir prefix=\"xdg\">fontconfig</cachedir>\n");
if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR) ||
!FcConfigAddCacheDir (config, (FcChar8 *) "~/.fontconfig"))
!FcConfigAddCacheDir (config, (FcChar8 *) prefix))
{
bail:
fprintf (stderr,
"Fontconfig error: out of memory");
free (prefix);
FcConfigDestroy (config);
return FcInitFallbackConfig ();
}
free (prefix);
}
return config;
......
......@@ -64,9 +64,11 @@ typedef HRESULT (WINAPI *pfnSHGetFolderPathA)(HWND, int, HANDLE, DWORD, LPSTR);
extern pfnGetSystemWindowsDirectory pGetSystemWindowsDirectory;
extern pfnSHGetFolderPathA pSHGetFolderPathA;
# define FC_SEARCH_PATH_SEPARATOR ';'
# define FC_DIR_SEPARATOR '\\'
# define FC_DIR_SEPARATOR_S "\\"
#else
# define FC_SEARCH_PATH_SEPARATOR ':'
# define FC_DIR_SEPARATOR '/'
# define FC_DIR_SEPARATOR_S "/"
#endif
......@@ -570,6 +572,15 @@ FcStat (const FcChar8 *file, struct stat *statb);
/* fccfg.c */
FcPrivate FcChar8 *
FcConfigXdgCacheHome (void);
FcPrivate FcChar8 *
FcConfigXdgConfigHome (void);
FcPrivate FcChar8 *
FcConfigXdgDataHome (void);
FcPrivate FcExpr *
FcConfigAllocExpr (FcConfig *config);
......
......@@ -896,11 +896,11 @@ FcStrCopyFilename (const FcChar8 *s)
FcChar8 *full;
int size;
if (!home)
return 0;
return NULL;
size = strlen ((char *) home) + strlen ((char *) s);
full = (FcChar8 *) malloc (size);
if (!full)
return 0;
return NULL;
strcpy ((char *) full, (char *) home);
strcat ((char *) full, (char *) s + 1);
new = FcStrCanonFilename (full);
......@@ -908,6 +908,7 @@ FcStrCopyFilename (const FcChar8 *s)
}
else
new = FcStrCanonFilename (s);
return new;
}
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment