Skip to content

Commit 92c65aa

Browse files
committed
Font (Windows): reads Control Panel registry directly
Improves performance
1 parent 76d6e86 commit 92c65aa

1 file changed

Lines changed: 29 additions & 8 deletions

File tree

src/detection/font/font_windows.c

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "font.h"
22
#include "common/windows/unicode.h"
3+
#include "common/windows/registry.h"
34

45
#include <windows.h>
56

@@ -23,19 +24,39 @@ static void generateString(FFFontResult* font)
2324
ffStrbufAppendC(&font->display, ']');
2425
}
2526

27+
WINUSERAPI WINBOOL WINAPI ClassicSystemParametersInfoW(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinIni);
28+
2629
const char* ffDetectFontImpl(FFFontResult* result)
2730
{
28-
NONCLIENTMETRICSW info = { .cbSize = sizeof(info) };
29-
if(!SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0))
30-
return "SystemParametersInfoW(SPI_GETNONCLIENTMETRICS) failed";
31+
FF_AUTO_CLOSE_FD HANDLE hKey = NULL;
32+
if (!ffRegOpenKeyForRead(HKEY_CURRENT_USER, L"Control Panel\\Desktop\\WindowMetrics", &hKey, NULL))
33+
return "ffRegOpenKeyForRead(HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics) failed";
34+
35+
FF_LIST_AUTO_DESTROY CaptionFont = ffListCreate(sizeof(uint8_t));
36+
FF_LIST_AUTO_DESTROY MenuFont = ffListCreate(sizeof(uint8_t));
37+
FF_LIST_AUTO_DESTROY MessageFont = ffListCreate(sizeof(uint8_t));
38+
FF_LIST_AUTO_DESTROY StatusFont = ffListCreate(sizeof(uint8_t));
39+
40+
if (!ffRegReadValues(hKey, 4, (FFRegValueArg[]) {
41+
FF_ARG(CaptionFont, L"CaptionFont"),
42+
FF_ARG(MenuFont, L"MenuFont"),
43+
FF_ARG(MessageFont, L"MessageFont"),
44+
FF_ARG(StatusFont, L"StatusFont"),
45+
}, NULL))
46+
return "ffRegReadValues(HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics) failed";
3147

32-
LOGFONTW* fonts[4] = { &info.lfCaptionFont, &info.lfMenuFont, &info.lfMessageFont, &info.lfStatusFont };
48+
FFlist* fonts[4] = { &CaptionFont, &MenuFont, &MessageFont, &StatusFont };
3349

34-
for(uint32_t i = 0; i < ARRAY_SIZE(fonts); ++i)
50+
for (uint32_t i = 0; i < ARRAY_SIZE(fonts); ++i)
3551
{
36-
ffStrbufSetWS(&result->fonts[i], fonts[i]->lfFaceName);
37-
if(fonts[i]->lfHeight < 0)
38-
ffStrbufAppendF(&result->fonts[i], " (%dpt)", (int)-fonts[i]->lfHeight);
52+
if (fonts[i]->length < sizeof(LOGFONTW))
53+
continue;
54+
55+
LOGFONTW* logFont = (LOGFONTW*) fonts[i]->data;
56+
57+
ffStrbufSetWS(&result->fonts[i], logFont->lfFaceName);
58+
if (logFont->lfHeight < 0)
59+
ffStrbufAppendF(&result->fonts[i], " (%dpt)", (int)-logFont->lfHeight);
3960
}
4061

4162
generateString(result);

0 commit comments

Comments
 (0)