#include "font.h" #include "common/windows/unicode.h" #include "common/windows/registry.h" #include static void generateString(FFFontResult* font) { const char* types[] = { "Caption", "Menu", "Message", "Status" }; for (uint32_t i = 0; i < ARRAY_SIZE(types); ++i) { if (i == 0 || !ffStrbufEqual(&font->fonts[i - 1], &font->fonts[i])) { if (i > 0) { ffStrbufAppendS(&font->display, "], "); } ffStrbufAppendF(&font->display, "%s [%s", font->fonts[i].chars, types[i]); } else { ffStrbufAppendS(&font->display, " / "); ffStrbufAppendS(&font->display, types[i]); } } ffStrbufAppendC(&font->display, ']'); } const char* ffDetectFontImpl(FFFontResult* result) { FF_AUTO_CLOSE_FD HANDLE hKey = NULL; if (!ffRegOpenKeyForRead(HKEY_CURRENT_USER, L"Control Panel\\Desktop\\WindowMetrics", &hKey, NULL)) { return "ffRegOpenKeyForRead(HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics) failed"; } LOGFONTW fonts[4]; FFArgBuffer fontBuffers[4] = { { .data = &fonts[0], .length = sizeof(fonts[0]) }, { .data = &fonts[1], .length = sizeof(fonts[1]) }, { .data = &fonts[2], .length = sizeof(fonts[2]) }, { .data = &fonts[3], .length = sizeof(fonts[3]) }, }; if (!ffRegReadValues(hKey, 4, (FFRegValueArg[]) { FF_ARG(fontBuffers[0], L"CaptionFont"), FF_ARG(fontBuffers[1], L"MenuFont"), FF_ARG(fontBuffers[2], L"MessageFont"), FF_ARG(fontBuffers[3], L"StatusFont"), }, NULL)) { return "ffRegReadValues(HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics) failed"; } for (uint32_t i = 0; i < ARRAY_SIZE(fonts); ++i) { if (fontBuffers[i].length != sizeof(LOGFONTW)) { continue; // Invalid data, skip } LOGFONTW* logFont = &fonts[i]; ffStrbufSetWS(&result->fonts[i], logFont->lfFaceName); if (logFont->lfHeight < 0) { ffStrbufAppendF(&result->fonts[i], " (%dpt)", (int) -logFont->lfHeight); } } generateString(result); return NULL; }