[Fontconfig] fontconfig priority management

Nicolas Mailhot nicolas.mailhot at laposte.net
Tue Oct 16 21:16:37 UTC 2018

Hi Akira,

> The priority number of fontconfig config files in packages is
> hardcoded at this moment. this requires huge works to update,
> particularly when changing default fonts say (even though it won't so
> often happens but still when fixing config files and updating for huge
> packages etc). so I'm pondering to manage the priority in centralized
> package and determine it at runtime, allowing users to have own
> ordering.
> I don't have any implementations for this but just to share an idea
> with you.

It’s great you’re looking at improving things! fontconfig has served us
well all those years. But there are really a lot more free and open
fonts nowadays than when fontconfig config syntax and file layout was
defined (which is wonderful!). So things are cracking a bit at the
seams, and not only on your side.

If I may give my opinion (CC-ing the fontconfig ML since I don't think
any of this is Fedora-specific). Probably more than what you asked, but
such is life ;)

1. fontconfig config syntax is too low level for the everyday needs of
2018. It was great when fonts on freedesktop systems were a small known
pile of semi-broken files squirrelled away by xorg and texlive, it’s not
so great to manage today’s huge numbers of standardized opentype files.
The current syntax allows writing excruciately precise and accurate
rules, except no human has the time to define those rules for every
possible font file we deploy, so we get to write precisely things we are
not so sure about.

2. so, this precise syntax should be kept to manage special cases, and
something simpler and higher level should be introduced, with more
things delegated to the fontconfig engine (like priorizing, as you
rightly noted). Something like, process special precise rule in low-
level fontconfig syntax first, then mass-process simplified high-level

3. the first higher level object should be a set-of-rules object, so
ordering can be managed independently of file layout (basically you
would order sets, regardless if the sets are each in their own file or
share a single file, and regardless of the naming of those files. So
stop shuffling and renaming files around to order things.

4. set ordering would be undefined and left to fontconfig by default,
with one explicit human-maintained per-generic sets-that-must-go-
first ordered list, and another per-generic sets-that-must-go-last list.
And optional per-script overrides for those lists. Everything in between
we don’t have the time and energy to order manually (and there’s no need

5. Of course, one copy of the lists in /usr/share/fontconfig for the
system integrator, with an override in /etc for the sysadmin, and
another override in .config for each user  

6. IMHO to keep things manageable you should have one set = one font
family (in the WWS sense, ie do not create as many sets as there are
font family name variations, do not create separate sets for acmefont
armenian and acmefont greek). We can extend font family definition to
more things than just WWS when apps learn to manage more facets than
just WWS for one font family, but at this point of time just doing WWS
is taxing for the average app. Things like caption fonts, math fonts,
etc should probably be merged with the WWS stuff eventually once we have
more experience on handling those transparently in apps.

7. that does force fontconfig to manage high-level simplified and
unified font family naming, instead of hoping font files will come with
clean  consistent naming (they don't and they won't, stop hoping for it,
stop relying on fontconfig config writers to fix it, stop inflicting on
users long lists of non-merged font names and expect them to jungle with
the result, managing technical splits in font families is fontconfig's
job not the user job, the user should only have to specify the design
and the style he wants). 

8. if there are several set definitions for the same font family at the
same level of config (system integrator, sysadmin or user) just merge
them transparently with undefined ordering rules when merging

9. if one set exists in several level, allow the override levels
(sysadmin and user) to define in their set if they want it merged with
lower levels or if they want it to replace the lower level definitions

10. The typical set should probably just define:
 * the generic the font family belongs to (what generic should be used
to complete the font family, and what generic should ne constructed from
the font family)
 * the list of known font families with similar design or metrics (so
substitute this font family to those other font families if they are
absent or lacking coverage, and conversely use those other font families
to complete the font family if it lacks coverage). I really don’t think
there is much benefit in ordering those manually. If there is some
benefit, ordering should be an explicit attribute of the list, not the

11. Eventually, the set could also contain
 * an explicit list of internal hidden font families to map to this set
(ie hide those font families from font lists, present only the unified
clean name, manage internally in fontconfig which font file to use
depending on what needs to be rendered)
 * the same thing, with also a face mapping, if face needs correction
 * an explicit "use this internal font family for this script" to manage
situations when there are regional variations on how to render an
unicode codepoint

12. though I do hope opentype tables in shipped fonts get complete
enough over time, and fontconfig gets smart enough over time, that all
those mappings and overrides won’t need manual declaration long term.
 * IMHO fontconfig should map automatically by default everything
defined in the WWS whitepaper,
 * and probably all the per-script/region/language common name

13. and since people will rightfully object that naming heuristics are
not reliable and fail in some cases
 * allow defining a set with a property that basically says "do not
merge me, I’m different"
 * make merging the default, and not-merging an explicit exception

With just that you should be able to handle 90% of what people need to
declare to fontconfig today (handwaves). And have something easy to
order at system, sysadmin or user level. The 10% of very specific and
complex configuration that does not fit in this simplified model, can be
handled with the current syntax. It’s small enough in volume that I
doubt its causes you lots of management problems.

Best regards,

Nicolas Mailhot

More information about the Fontconfig mailing list