master ohmu/fastfetch-openbsd / src / detection / displayserver / displayserver.c
ohmu  ·  2026-10-15
 1#include "displayserver.h"
 2#include "common/FFcache.h"
 3
 4FFDisplayResult* ffdsAppendDisplay(
 5    FFDisplayServerResult* result,
 6    uint32_t width,
 7    uint32_t height,
 8    double refreshRate,
 9    uint32_t dpi,
10    uint32_t preferredWidth,
11    uint32_t preferredHeight,
12    double preferredRefreshRate,
13    uint32_t rotation,
14    FFstrbuf* name,
15    FFDisplayType type,
16    bool primary,
17    uint64_t id,
18    uint32_t physicalWidth,
19    uint32_t physicalHeight,
20    const char* platformApi) {
21    if (width == 0 || height == 0) {
22        return nullptr;
23    }
24
25    FFDisplayResult* display = FF_LIST_ADD(FFDisplayResult, result->displays);
26    display->width = width;
27    display->height = height;
28    display->refreshRate = refreshRate;
29    display->dpi = dpi ?: 96; // 0 means unknown
30    display->preferredWidth = preferredWidth;
31    display->preferredHeight = preferredHeight;
32    display->preferredRefreshRate = preferredRefreshRate;
33    display->rotation = rotation;
34    ffStrbufInitMove(&display->name, name);
35    display->type = type;
36    display->id = id;
37    display->physicalWidth = physicalWidth;
38    display->physicalHeight = physicalHeight;
39    display->primary = primary;
40    display->platformApi = platformApi;
41
42    display->bitDepth = 0;
43    display->hdrStatus = FF_DISPLAY_HDR_STATUS_UNKNOWN;
44    display->manufactureYear = 0;
45    display->manufactureWeek = 0;
46    ffStrbufInit(&display->serial);
47    display->drrStatus = FF_DISPLAY_DRR_STATUS_UNKNOWN;
48
49    return display;
50}
51
52void ffConnectDisplayServerImpl(FFDisplayServerResult* ds);
53
54static FFDisplayServerResult result;
55
56static void initDisplayServerResult(void* storage) {
57    FFDisplayServerResult* ds = storage;
58
59    ffStrbufInit(&ds->wmProcessName);
60    ffStrbufInit(&ds->wmPrettyName);
61    ffStrbufInit(&ds->wmProtocolName);
62    ffStrbufInit(&ds->deProcessName);
63    ffStrbufInit(&ds->dePrettyName);
64    ffListInit(&ds->displays);
65
66    ffConnectDisplayServerImpl(ds);
67}
68
69static void destroyDisplayServerResult(void* storage) {
70    FFDisplayServerResult* ds = storage;
71
72    ffStrbufDestroy(&ds->wmProcessName);
73    ffStrbufDestroy(&ds->wmPrettyName);
74    ffStrbufDestroy(&ds->wmProtocolName);
75    ffStrbufDestroy(&ds->deProcessName);
76    ffStrbufDestroy(&ds->dePrettyName);
77
78    // Every display owns its name and serial, which are lost if the list is dropped as a whole
79    FF_LIST_FOR_EACH (FFDisplayResult, display, ds->displays) {
80        ffStrbufDestroy(&display->name);
81        ffStrbufDestroy(&display->serial);
82    }
83    ffListDestroy(&ds->displays);
84}
85
86static FFcacheEntry ffCacheEntryDisplayServer = {
87    .name = "displayServer",
88    .storage = &result,
89    .init = initDisplayServerResult,
90    .destroy = destroyDisplayServerResult,
91};
92
93const FFDisplayServerResult* ffConnectDisplayServer() {
94    return ffCacheGet(&ffCacheEntryDisplayServer);
95}