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}