ohmu
·
2026-10-15
1#include "fastfetch.h"
2#include "wmtheme.h"
3#include "common/windows/registry.h"
4
5const char* colorHexToString(DWORD hex) {
6 switch (hex) {
7 case 0x696cc3:
8 return "Yellow gold";
9 case 0xff8c00:
10 return "Gold";
11 case 0xf7630c:
12 return "Orange bright";
13 case 0xca5010:
14 return "Orange dark";
15 case 0xda3b01:
16 return "Rust";
17 case 0xef6950:
18 return "Pale rust";
19 case 0xd13438:
20 return "Brick red";
21 case 0xff4343:
22 return "Mod red";
23 case 0xe74856:
24 return "Pale red";
25 case 0xe81123:
26 return "Red";
27 case 0xea005e:
28 return "Rose bright";
29 case 0xc30052:
30 return "Rose";
31 case 0xe3008c:
32 return "Plum light";
33 case 0xbf0077:
34 return "Plum";
35 case 0xc239b3:
36 return "Orchid light";
37 case 0x9a0089:
38 return "Orchid";
39 case 0x0078d4:
40 return "Blue";
41 case 0x0063b1:
42 return "Navy blue";
43 case 0x8d8bd7:
44 return "Purple shadow";
45 case 0x6b69d6:
46 return "Purple shadow dark";
47 case 0x8764b8:
48 return "Iris pastel";
49 case 0x744da9:
50 return "Iris Spring";
51 case 0xb146c2:
52 return "Violet red light";
53 case 0x881798:
54 return "Violet red";
55 case 0x0099bc:
56 return "Cool blue bright";
57 case 0x2d7d9a:
58 return "Cool blue";
59 case 0x00b7c3:
60 return "Seafoam";
61 case 0x038387:
62 return "Seafoam teal";
63 case 0x00b294:
64 return "Mint light";
65 case 0x018574:
66 return "Mint dark";
67 case 0x00cc6a:
68 return "Turf green";
69 case 0x10893e:
70 return "Sport green";
71 case 0x7a7574:
72 return "Gray";
73 case 0x5d5a58:
74 return "Gray brown";
75 case 0x68768a:
76 return "Steel blue";
77 case 0x515c6b:
78 return "Metal blue";
79 case 0x567c73:
80 return "Pale moss";
81 case 0x486860:
82 return "Moss";
83 case 0x498205:
84 return "Meadow green";
85 case 0x107c10:
86 return "Green";
87 case 0x767676:
88 return "Overcast";
89 case 0x4c4a48:
90 return "Storm";
91 case 0x69797e:
92 return "Blue gray";
93 case 0x4a5459:
94 return "Gray dark";
95 case 0x647c64:
96 return "Liddy green";
97 case 0x4c574e:
98 return "Sage";
99 case 0x807143:
100 return "Camouflage desert";
101 case 0x766c59:
102 return "Camouflage";
103 case 0x000000:
104 return "Black";
105 case 0xFFFFFF:
106 return "White";
107 default:
108 return nullptr;
109 }
110}
111
112bool ffDetectWmTheme(FFstrbuf* themeOrError) {
113 {
114 FF_AUTO_CLOSE_FD HANDLE hKey = nullptr;
115 if (ffRegOpenKeyForRead(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes", &hKey, nullptr)) {
116 FF_STRBUF_AUTO_DESTROY theme = ffStrbufCreate();
117 if (ffRegReadStrbuf(hKey, L"CurrentTheme", &theme, nullptr)) {
118 ffStrbufSubstrBeforeLastC(&theme, '.');
119 ffStrbufSubstrAfterLastC(&theme, '\\');
120 if (isalpha(theme.chars[0])) {
121 theme.chars[0] = (char) toupper(theme.chars[0]);
122 }
123
124 ffStrbufAppend(themeOrError, &theme);
125 }
126 }
127 }
128
129 do {
130 uint32_t rgbColor;
131 uint32_t bgrColor;
132 FF_AUTO_CLOSE_FD HANDLE hKey = nullptr;
133 if (ffRegOpenKeyForRead(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\DWM", &hKey, nullptr)) {
134 if (ffRegReadUint(hKey, L"AccentColor", &bgrColor, nullptr)) {
135 rgbColor = ((bgrColor & 0xFF) << 16) | (bgrColor & 0xFF00) | ((bgrColor >> 16) & 0xFF);
136 } else if (ffRegReadUint(hKey, L"ColorizationColor", &rgbColor, nullptr)) {
137 rgbColor &= 0xFFFFFF;
138 } else {
139 break;
140 }
141 } else {
142 break;
143 }
144
145 if (themeOrError->length > 0) {
146 ffStrbufAppendS(themeOrError, " - ");
147 }
148 const char* text = colorHexToString(rgbColor);
149 if (text) {
150 ffStrbufAppendS(themeOrError, text);
151 } else {
152 ffStrbufAppendF(themeOrError, "#%06lX", (long) rgbColor);
153 }
154 } while (false);
155
156 {
157 FF_AUTO_CLOSE_FD HANDLE hKey = nullptr;
158 if (ffRegOpenKeyForRead(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", &hKey, nullptr)) {
159 uint32_t system = 1, apps = 1;
160 if (ffRegReadValues(hKey, 2, (FFRegValueArg[]) {
161 FF_ARG(system, L"SystemUsesLightTheme"),
162 FF_ARG(apps, L"AppsUseLightTheme"),
163 },
164 nullptr)) {
165 bool paren = themeOrError->length > 0;
166 if (paren) {
167 ffStrbufAppendS(themeOrError, " (");
168 }
169 ffStrbufAppendF(themeOrError, "System: %s, Apps: %s", system ? "Light" : "Dark", apps ? "Light" : "Dark");
170 if (paren) {
171 ffStrbufAppendC(themeOrError, ')');
172 }
173 }
174 }
175 }
176
177 if (themeOrError->length == 0) {
178 ffStrbufSetStatic(themeOrError, "Failed to find current theme");
179 return false;
180 }
181 return true;
182}