diff --git a/client/include/util.h b/client/include/util.h index 6443efae..3fbfb5c4 100644 --- a/client/include/util.h +++ b/client/include/util.h @@ -49,6 +49,8 @@ static inline double util_clamp(double x, double min, double max) return x; } +bool util_initUIFonts(void); +void util_freeUIFonts(void); char * util_getUIFont(const char * fontName); #endif diff --git a/client/src/main.c b/client/src/main.c index d0f4e523..dbf692fc 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -827,8 +827,11 @@ static int lg_run(void) g_state.io->BackendFlags |= ImGuiBackendFlags_HasMouseCursors; g_state.windowScale = 1.0; - g_state.fontName = util_getUIFont(g_params.uiFont); - DEBUG_INFO("Using font: %s", g_state.fontName); + if (util_initUIFonts()) + { + g_state.fontName = util_getUIFont(g_params.uiFont); + DEBUG_INFO("Using font: %s", g_state.fontName); + } app_initOverlays(); @@ -1306,6 +1309,7 @@ int main(int argc, char * argv[]) config_free(); + util_freeUIFonts(); cleanupCrashHandler(); return ret; } diff --git a/client/src/util.c b/client/src/util.c index 570d5e5e..ada73d5f 100644 --- a/client/src/util.c +++ b/client/src/util.c @@ -31,6 +31,8 @@ #include #include +static FcConfig * FontConfig = NULL; + bool util_fileGetContents(const char * filename, char ** buffer, size_t * length) { FILE * fh = fopen(filename, "r"); @@ -259,20 +261,26 @@ int util_mergeOverlappingRects(FrameDamageRect * rects, int count) return o; } -char * util_getUIFont(const char * fontName) +bool util_initUIFonts(void) { - static FcConfig * fc = NULL; - char * ttf = NULL; + if (FontConfig) + return true; - if (!fc) - fc = FcInitLoadConfigAndFonts(); + FontConfig = FcInitLoadConfigAndFonts(); - if (!fc) + if (!FontConfig) { DEBUG_ERROR("FcInitLoadConfigAndFonts Failed"); - return NULL; + return false; } + return true; +} + +char * util_getUIFont(const char * fontName) +{ + char * ttf = NULL; + FcPattern * pat = FcNameParse((const FcChar8*) fontName); if (!pat) { @@ -280,11 +288,11 @@ char * util_getUIFont(const char * fontName) return NULL; } - FcConfigSubstitute(fc, pat, FcMatchPattern); + FcConfigSubstitute(FontConfig, pat, FcMatchPattern); FcDefaultSubstitute(pat); FcResult result; FcChar8 * file = NULL; - FcPattern * match = FcFontMatch(fc, pat, &result); + FcPattern * match = FcFontMatch(FontConfig, pat, &result); if (!match) { @@ -303,3 +311,13 @@ fail_parse: FcPatternDestroy(pat); return ttf; } + +void util_freeUIFonts(void) +{ + if (!FontConfig) + return; + + FcConfigDestroy(FontConfig); + FontConfig = NULL; + FcFini(); +}