Font: improve performance (Windows)

This commit is contained in:
李通洲 2022-11-23 19:57:55 +08:00
parent 31863baee2
commit 325aa536c4
5 changed files with 31 additions and 36 deletions

View File

@ -434,7 +434,7 @@ elseif(WIN32)
src/detection/cursor/cursor_windows.c
src/detection/disk/disk_windows.c
src/detection/displayserver/displayserver_windows.c
src/detection/font/font_windows.cpp
src/detection/font/font_windows.c
src/detection/gpu/gpu_windows.cpp
src/detection/host/host_windows.c
src/detection/localip/localip_windows.c

View File

@ -14,7 +14,7 @@ typedef struct FFFontResult
/**
* Linux / BSD: QT, GTK2, GTK3, GTK4
* MacOS: System, User, System Mono, User Mono
* Windows: Desktop, Unset, Unset, Unset
* Windows: Caption, Menu, Message, Status
* Other: Unset, Unset, Unset, Unset
*/
FFstrbuf fonts[FF_DETECT_FONT_NUM_FONTS];

View File

@ -0,0 +1,22 @@
#include "font.h"
#include "util/windows/unicode.h"
#include <winuser.h>
void ffDetectFontImpl(const FFinstance* instance, FFFontResult* result)
{
FF_UNUSED(instance);
NONCLIENTMETRICSW info = { .cbSize = sizeof(info) };
if(!SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0))
ffStrbufAppendS(&result->error, "SystemParametersInfoW(SPI_GETNONCLIENTMETRICS) failed");
LOGFONTW* fonts[4] = { &info.lfCaptionFont, &info.lfMenuFont, &info.lfMessageFont, &info.lfStatusFont };
for(uint32_t i = 0; i < sizeof(fonts) / sizeof(fonts[0]); ++i)
{
ffWcharToUtf8(fonts[i]->lfFaceName, &result->fonts[i]);
if(fonts[i]->lfHeight < 0)
ffStrbufAppendF(&result->fonts[i], " (%dpt)", (int)-fonts[i]->lfHeight);
}
}

View File

@ -1,32 +0,0 @@
extern "C" {
#include "font.h"
#include "common/font.h"
}
#include "util/windows/wmi.hpp"
#include <wchar.h>
extern "C"
void ffDetectFontImpl(const FFinstance* instance, FFFontResult* result)
{
wchar_t sql[256] = {};
swprintf(sql, 256, L"SELECT IconTitleFaceName, IconTitleSize FROM Win32_Desktop WHERE Name LIKE '%%\\\\%s'", instance->state.passwd->pw_name);
FFWmiQuery query(sql, &result->error);
if(!query)
return;
if(FFWmiRecord record = query.next())
{
FF_STRBUF_AUTO_DESTROY fontName;
ffStrbufInit(&fontName);
record.getString(L"IconTitleFaceName", &fontName);
uint64_t fontSize;
record.getUnsigned(L"IconTitleSize", &fontSize);
ffStrbufAppendF(&result->fonts[0], "%*s (%upt)", fontName.length, fontName.chars, (unsigned)fontSize);
}
else
ffStrbufInitS(&result->error, "No WMI result returned");
}

View File

@ -45,9 +45,14 @@ static void printFont(const FFFontResult* font)
static void printFont(const FFFontResult* font)
{
if(font->fonts[0].length > 0)
const char* types[] = { "Caption", "Menu", "Message", "Status" };
for(uint32_t i = 0; i < sizeof(types) / sizeof(types[0]); ++i)
{
printf("%s [Desktop]", font->fonts[0].chars);
if(font->fonts[i].length > 0)
{
printf("%s [%s]", font->fonts[i].chars, types[i]);
break;
}
}
}