mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-10-28 10:40:11 +01:00
67 lines
2.5 KiB
C
67 lines
2.5 KiB
C
#include "font.h"
|
|
#include "common/debug.h"
|
|
#include "common/windows/unicode.h"
|
|
#include "common/windows/registry.h"
|
|
|
|
#include <windows.h>
|
|
|
|
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 = nullptr;
|
|
if (!ffRegOpenKeyForRead(HKEY_CURRENT_USER, L"Control Panel\\Desktop\\WindowMetrics", &hKey, nullptr)) {
|
|
FF_DEBUG("ffRegOpenKeyForRead(Control Panel\\Desktop\\WindowMetrics) failed");
|
|
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"),
|
|
},
|
|
nullptr)) {
|
|
FF_DEBUG("ffRegReadValues(CaptionFont/MenuFont/MessageFont/StatusFont) failed");
|
|
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 nullptr;
|
|
}
|