<div dir="ltr">Hey guys.<div><br></div><div>This is my first post, so I hope i'm doing it right and that's the right place (couldn't find a better one).</div><div><br></div><div>I am using fontconfig to get a font and a related list of fallback fonts for styles such as regular/bold/italic/bold-italic but also a font with font family "emoji".</div><div><br></div><div>While it works in general, I wonder why - not matter what - it seems that "Noto Color Emoji" font family is placed on second place of the fonts returned by FcFontSort.</div><div><br></div><div>This is what I do:</div><div><br></div><div>        auto const family = string(_family);<br>        auto pat = unique_ptr<FcPattern, void(*)(FcPattern*)>(FcPatternCreate(), [](auto p) { FcPatternDestroy(p); });<br><br>        FcPatternAddBool(pat.get(), FC_OUTLINE, true);<br>        FcPatternAddBool(pat.get(), FC_SCALABLE, true);<br>        //FcPatternAddBool(pat.get(), FC_EMBEDDED_BITMAP, false);<br><br>        FcPatternAddBool(pat.get(), FC_COLOR, _color); // with _color being bool (either true or false)<br><br>        if (!_family.empty()) // such as "Fira Code" or "emoji"<br>            FcPatternAddString(pat.get(), FC_FAMILY, (FcChar8 const*) family.c_str());<br><br>        if (_monospace)<br>        {<br>            if (_family != "monospace")<br>                FcPatternAddString(pat.get(), FC_FAMILY, (FcChar8 const*) "monospace");<br>            FcPatternAddInteger(pat.get(), FC_SPACING, FC_MONO); // in monospace (non-emoji), mono and dual are okay.<br>            FcPatternAddInteger(pat.get(), FC_SPACING, FC_DUAL); // tried with and without this line<br>        }<br><br>        if (int(_style) & int(FontStyle::Bold))<br>            FcPatternAddInteger(pat.get(), FC_WEIGHT, FC_WEIGHT_BOLD);<br><br>        if (int(_style) & int(FontStyle::Italic))<br>            FcPatternAddInteger(pat.get(), FC_SLANT, FC_SLANT_ITALIC);<br><br>        FcConfigSubstitute(nullptr, pat.get(), FcMatchPattern);<br>        FcDefaultSubstitute(pat.get());<br><br>        FcResult result = FcResultNoMatch;<br>        auto fs = unique_ptr<FcFontSet, void(*)(FcFontSet*)>(<br>            FcFontSort(nullptr, pat.get(), /*unicode-trim*/FcTrue, /*FcCharSet***/nullptr, &result),<br>            [](auto p) { FcFontSetDestroy(p); });<br></div><div><br></div><div><br></div><div>Now, fs contains the FontSet prioritized by closeness (that's what the docs are saying), so I believe that means, I can use that as font fallback list.</div><div>With first font being the requested one (or close match), and a prioritized list of fallbacks to walk through in case needed.</div><div><br></div><div>For some reason, the second font in the list for regular fonts (font family is NOT "emoji" and _color is set to false) is actually "Noto Color Emoji Regular".</div><div>I really tried hard to get it to a point where FcFontSort gets me only what I requested via FcPatternAddXXX, but it sometimes looks like</div><div>all my FcPatternAddXXX don't mean anything.</div><div><br></div><div>Secondly, when I request monospace fonts (_monospace == true, _color = false), then FcFontSort also returns fonts</div><div>whose FC_SPACING  is not FC_MONO or FC_MONO, in fact:</div><div><br></div><div>            int spacing = -1; // ignore font if we cannot retrieve spacing information<br>            FcPatternGetInteger(font, FC_SPACING, 0, &spacing);<br>            if (_monospace && spacing < FC_DUAL) continue; /* don't include non-monospace fonts if not requested).</div><div><br></div><div>This call to FcPatternGetInteger(... FC_SPACING, ...) seems to fail quite often (does not store the value in spacing, as it remains -1.</div><div><br></div><div>Whereas the following:</div><div><br></div><div>            FcBool color = FcFalse;<br>            FcPatternGetInteger(font, FC_COLOR, 0, &color);<br></div><div><br></div><div>never yields true/FcTrue not even for Noto Color Emoji. </div><div><br></div><div>(If that matters, this was tested on Ubuntu 20.10).</div><div><br></div><div>It is really not the easiest to find good examples on how to use this API, so I may as well just be doing it wrong.</div><div>But if so, I'd really appreciate some hint or indication of what I could do to achieve that.</div><div><br></div><div>The purpose of all this is, that I am developing a terminal emulator where I use fontconfig to find monospace fonts (with font fallback)</div><div>as well as emoji in color and emoji text versions (for emoji text versions, it seems I can use use the regular monospace font,</div><div>iff it wouldn't include "Noto Color Emoji" so far on top in the priority list. Explicitely hardcoding it out via a hacky if-statement</div><div>yields the expected result, but that can't be it.</div><div>At the same time, gnome-terminal & kitty chose the right fonts (with everything configured the same).</div><div>For kitty I know it's not using FcFontSort, as it priorizes manually, maybe because of the above?</div><div><br></div><div>I'd realy appreciate some feedback here,</div><div>Many thanks in advance,</div><div>Christian Parpart.</div><div><br></div><div><br></div><div><br></div><div><br></div></div>