Mercurial > minori
annotate src/sys/win32/dark_theme.cc @ 105:6d8da6e64d61
theme: add dark stylesheet, make it actually usable
win32: make the titlebar black where available
| author | Paper <mrpapersonic@gmail.com> |
|---|---|
| date | Sun, 05 Nov 2023 03:54:26 -0500 |
| parents | 9b2b41f83a5e |
| children | c8c72278f6fd |
| rev | line source |
|---|---|
| 9 | 1 #include "sys/win32/dark_theme.h" |
|
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
2 #include <QApplication> |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
3 #include <QDebug> |
| 2 | 4 #include <QOperatingSystemVersion> |
| 9 | 5 #include <QSettings> |
|
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
6 #include <QWidget> |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
7 #include <iostream> |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
8 #include <dwmapi.h> |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
9 |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
10 /* let's make a class wrapper around HINSTANCE, |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
11 so we don't fuck anything up :). */ |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
12 class Library { |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
13 public: |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
14 Library() {} |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
15 ~Library() { |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
16 Unload(); |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
17 } |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
18 void Unload() { |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
19 if (hInstance) |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
20 FreeLibrary(hInstance); |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
21 loaded = false; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
22 } |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
23 void Load(LPCWSTR name) { |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
24 if (loaded) |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
25 Unload(); |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
26 hInstance = LoadLibraryW(name); |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
27 if (hInstance) |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
28 loaded = true; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
29 } |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
30 HINSTANCE GetInstance() { |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
31 return hInstance; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
32 } |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
33 bool IsLoaded() { |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
34 return loaded; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
35 } |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
36 private: |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
37 HINSTANCE hInstance = nullptr; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
38 bool loaded = false; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
39 }; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
40 |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
41 Library dwmapi; |
| 9 | 42 |
| 43 namespace win32 { | |
| 44 | |
|
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
45 #define GET_FUNCTION(f, i) \ |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
46 reinterpret_cast<decltype(::f)*>(GetProcAddress(i, #f)) |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
47 |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
48 static HRESULT SetWindowAttribute(HWND hWnd, DWORD key, LPCVOID data, DWORD sz_data) { |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
49 if (!dwmapi.IsLoaded()) { |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
50 dwmapi.Load(L"dwmapi.dll"); |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
51 if (!dwmapi.IsLoaded()) |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
52 return false; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
53 } |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
54 |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
55 HINSTANCE hInstance = dwmapi.GetInstance(); |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
56 if (!hInstance) |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
57 return false; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
58 |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
59 auto set_wind_attrib = GET_FUNCTION(DwmSetWindowAttribute, hInstance); |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
60 if (!set_wind_attrib) |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
61 return false; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
62 |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
63 return set_wind_attrib(hWnd, key, data, sz_data); |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
64 } |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
65 |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
66 /* Ok, so this doesn't work. Woohoo! :) */ |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
67 bool SetTitleBarToBlack(QWidget* win, bool enabled) { |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
68 BOOL b = enabled; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
69 |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
70 /* MAGIC NUMBERS: 19 and 20 are both DWMWA_USE_IMMERSIVE_DARK_MODE. |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
71 clarification: it's 20 on newer versions of windows (i.e. win11 and late win10), |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
72 but it's 19 on very old versions of win10 nobody ought to be using. */ |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
73 { |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
74 HRESULT result = SetWindowAttribute(reinterpret_cast<HWND>(win->winId()), 20, &b, sizeof(b)); |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
75 if (result == S_OK) |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
76 return b; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
77 } |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
78 |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
79 { |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
80 /* It's 19 in older Windows 10 versions. Yeah, stupid. */ |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
81 HRESULT result = SetWindowAttribute(reinterpret_cast<HWND>(win->winId()), 19, &b, sizeof(b)); |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
82 if (result == S_OK) |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
83 return b; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
84 } |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
85 |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
86 return b; |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
87 } |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
88 |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
89 void SetTitleBarsToBlack(bool enabled) { |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
90 for (QWidget* widget : qApp->topLevelWidgets()) { |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
91 SetTitleBarToBlack(widget, enabled); |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
92 } |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
93 } |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
94 |
| 9 | 95 bool DarkThemeAvailable() { |
|
66
6481c5aed3e1
posters: add poster widget...
Paper <mrpapersonic@gmail.com>
parents:
15
diff
changeset
|
96 const auto& ver = QOperatingSystemVersion::current(); |
|
6481c5aed3e1
posters: add poster widget...
Paper <mrpapersonic@gmail.com>
parents:
15
diff
changeset
|
97 return (ver.majorVersion() > 10) ? true : (ver.majorVersion() == 10 && ver.microVersion() >= 17763); |
| 2 | 98 } |
| 99 | |
| 9 | 100 bool IsInDarkTheme() { |
| 15 | 101 QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", |
| 102 QSettings::NativeFormat); | |
| 9 | 103 return settings.value("AppsUseLightTheme", 1).toInt() == 0; |
| 2 | 104 } |
| 9 | 105 |
| 106 } // namespace win32 |
