master ohmu/fastfetch-openbsd / src / detection / font / font_windows.c
ohmu  ·  2026-10-15
 1#include "font.h"
 2#include "common/debug.h"
 3#include "common/windows/unicode.h"
 4#include "common/windows/registry.h"
 5
 6#include <windows.h>
 7
 8static void generateString(FFFontResult* font) {
 9    const char* types[] = { "Caption", "Menu", "Message", "Status" };
10    for (uint32_t i = 0; i < ARRAY_SIZE(types); ++i) {
11        if (i == 0 || !ffStrbufEqual(&font->fonts[i - 1], &font->fonts[i])) {
12            if (i > 0) {
13                ffStrbufAppendS(&font->display, "], ");
14            }
15            ffStrbufAppendF(&font->display, "%s [%s", font->fonts[i].chars, types[i]);
16        } else {
17            ffStrbufAppendS(&font->display, " / ");
18            ffStrbufAppendS(&font->display, types[i]);
19        }
20    }
21    ffStrbufAppendC(&font->display, ']');
22}
23
24const char* ffDetectFontImpl(FFFontResult* result) {
25    FF_AUTO_CLOSE_FD HANDLE hKey = nullptr;
26    if (!ffRegOpenKeyForRead(HKEY_CURRENT_USER, L"Control Panel\\Desktop\\WindowMetrics", &hKey, nullptr)) {
27        FF_DEBUG("ffRegOpenKeyForRead(Control Panel\\Desktop\\WindowMetrics) failed");
28        return "ffRegOpenKeyForRead(HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics) failed";
29    }
30
31    LOGFONTW fonts[4];
32    FFArgBuffer fontBuffers[4] = {
33        { .data = &fonts[0], .length = sizeof(fonts[0]) },
34        { .data = &fonts[1], .length = sizeof(fonts[1]) },
35        { .data = &fonts[2], .length = sizeof(fonts[2]) },
36        { .data = &fonts[3], .length = sizeof(fonts[3]) },
37    };
38
39    if (!ffRegReadValues(hKey, 4, (FFRegValueArg[]) {
40                                      FF_ARG(fontBuffers[0], L"CaptionFont"),
41                                      FF_ARG(fontBuffers[1], L"MenuFont"),
42                                      FF_ARG(fontBuffers[2], L"MessageFont"),
43                                      FF_ARG(fontBuffers[3], L"StatusFont"),
44                                  },
45            nullptr)) {
46        FF_DEBUG("ffRegReadValues(CaptionFont/MenuFont/MessageFont/StatusFont) failed");
47        return "ffRegReadValues(HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics) failed";
48    }
49
50    for (uint32_t i = 0; i < ARRAY_SIZE(fonts); ++i) {
51        if (fontBuffers[i].length != sizeof(LOGFONTW)) {
52            continue; // Invalid data, skip
53        }
54
55        LOGFONTW* logFont = &fonts[i];
56
57        ffStrbufSetWS(&result->fonts[i], logFont->lfFaceName);
58        if (logFont->lfHeight < 0) {
59            ffStrbufAppendF(&result->fonts[i], " (%dpt)", (int) -logFont->lfHeight);
60        }
61    }
62
63    generateString(result);
64
65    return nullptr;
66}