master ohmu/fastfetch-openbsd / src / detection / wmtheme / wmtheme_windows.c
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}