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+
2629const 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