May 27, 2020
I (used to) use DejaVu (
ttf-dejavu) as my main system and default font
on Arch Linux and I’ve been mildly bothered about some emoji not being
displayed as color emoji even though I have
installed, and instead being displayed as black and white glyphs.
For a while, I’ve haven’t been bothered enough by it to actually dig into it, but recently I’ve decided to spend the time to figure it out.
If you use
ttf-dejavu, remove it and install
which is essentially the same font without the Unicode additions. Then
if you want some proper Unicode support, make sure to have
installed as well, so that it will fall back to Noto Unicode characters
when they’re not defined by Vera.
Alternatively, just remove DejaVu and make Noto your default font, period (which is even simpler and is what I’ve done in the end since I ended up liking the look of the Noto fonts even better).
The black and white glyphs are from the
ttf-dejavu font, which is
tff-bitstream-vera with added Unicode support, but that
also includes some black and white emoji.
This means that if you have an emoji font as fallback, e.g.
ttf-dejavu will still have priority over the
subset of emoji that it defines.
Since it’s not currently possible to blacklist part of a font characters
in fontconfig, there’s been some forks of
ttf-dejavu to remove emoji
characters, but still keep the other Unicode additions. This seems like
a good idea but the AUR package for that is fairly outdated and people
seem to report issues with it, so I would rather not go that way.
I’ve also found on Reddit a fontconfig, well, config, to fix that issue, which essentially sets the default font to Noto instead of DejaVu, and Noto natively don’t try to conflict with the emoji font, so that works.
However, some websites depending on the font they request, and depending on your browser, and configuration, and a bunch of other shit, are still gonna be using DejaVu if it’s installed, and then you’ll get the black and white emoji back, since that config only makes Noto and its color emoji the default for generic fonts.
At that point you can just remove DejaVu altogether, which is the solution I ended up going for, but if you want to keep the DejaVu/Vera font as your default system font, read on.
I’ve spent some more time digging, and I’ve eventually found a setup that so far seems to work consistently across browsers and websites, and the good thing is that it’s simple and doesn’t require any manual configuration.
ttf-dejavu and install
which is essentially the same font, without the addition of Unicode
glyphs, and then make sure to have
noto-fonts installed as a fallback
for Unicode stuff.
Since unlike DejaVu, Noto doesn’t try to define its own emoji, it’ll cleanly fall through, first, Vera, then for the Unicode characters not found in Vera, it’ll fall back to Noto, and finally it’ll use whatever emoji font you have installed!
I hope that helps!