|
@@ -2398,14 +2398,14 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
|
} break;
|
|
} break;
|
|
case WM_SETTINGCHANGE: {
|
|
case WM_SETTINGCHANGE: {
|
|
if (lParam && CompareStringOrdinal(reinterpret_cast<LPCWCH>(lParam), -1, L"ImmersiveColorSet", -1, true) == CSTR_EQUAL) {
|
|
if (lParam && CompareStringOrdinal(reinterpret_cast<LPCWCH>(lParam), -1, L"ImmersiveColorSet", -1, true) == CSTR_EQUAL) {
|
|
- if (is_dark_mode_supported()) {
|
|
|
|
|
|
+ if (is_dark_mode_supported() && dark_title_available) {
|
|
BOOL value = is_dark_mode();
|
|
BOOL value = is_dark_mode();
|
|
::DwmSetWindowAttribute(windows[window_id].hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value));
|
|
::DwmSetWindowAttribute(windows[window_id].hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} break;
|
|
} break;
|
|
case WM_THEMECHANGED: {
|
|
case WM_THEMECHANGED: {
|
|
- if (is_dark_mode_supported()) {
|
|
|
|
|
|
+ if (is_dark_mode_supported() && dark_title_available) {
|
|
BOOL value = is_dark_mode();
|
|
BOOL value = is_dark_mode();
|
|
::DwmSetWindowAttribute(windows[window_id].hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value));
|
|
::DwmSetWindowAttribute(windows[window_id].hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value));
|
|
}
|
|
}
|
|
@@ -3520,7 +3520,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
|
|
wd.pre_fs_valid = true;
|
|
wd.pre_fs_valid = true;
|
|
}
|
|
}
|
|
|
|
|
|
- if (is_dark_mode_supported()) {
|
|
|
|
|
|
+ if (is_dark_mode_supported() && dark_title_available) {
|
|
BOOL value = is_dark_mode();
|
|
BOOL value = is_dark_mode();
|
|
::DwmSetWindowAttribute(wd.hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value));
|
|
::DwmSetWindowAttribute(wd.hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value));
|
|
}
|
|
}
|
|
@@ -3612,6 +3612,7 @@ WTPacketPtr DisplayServerWindows::wintab_WTPacket = nullptr;
|
|
WTEnablePtr DisplayServerWindows::wintab_WTEnable = nullptr;
|
|
WTEnablePtr DisplayServerWindows::wintab_WTEnable = nullptr;
|
|
|
|
|
|
// UXTheme API.
|
|
// UXTheme API.
|
|
|
|
+bool DisplayServerWindows::dark_title_available = false;
|
|
bool DisplayServerWindows::ux_theme_available = false;
|
|
bool DisplayServerWindows::ux_theme_available = false;
|
|
IsDarkModeAllowedForAppPtr DisplayServerWindows::IsDarkModeAllowedForApp = nullptr;
|
|
IsDarkModeAllowedForAppPtr DisplayServerWindows::IsDarkModeAllowedForApp = nullptr;
|
|
ShouldAppsUseDarkModePtr DisplayServerWindows::ShouldAppsUseDarkMode = nullptr;
|
|
ShouldAppsUseDarkModePtr DisplayServerWindows::ShouldAppsUseDarkMode = nullptr;
|
|
@@ -3704,7 +3705,21 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
|
// Enforce default keep screen on value.
|
|
// Enforce default keep screen on value.
|
|
screen_set_keep_on(GLOBAL_GET("display/window/energy_saving/keep_screen_on"));
|
|
screen_set_keep_on(GLOBAL_GET("display/window/energy_saving/keep_screen_on"));
|
|
|
|
|
|
- // Load UXTheme
|
|
|
|
|
|
+ // Load Windows version info.
|
|
|
|
+ OSVERSIONINFOW os_ver;
|
|
|
|
+ ZeroMemory(&os_ver, sizeof(OSVERSIONINFOW));
|
|
|
|
+ os_ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
|
|
|
|
+
|
|
|
|
+ HMODULE nt_lib = LoadLibraryW(L"ntdll.dll");
|
|
|
|
+ if (nt_lib) {
|
|
|
|
+ RtlGetVersionPtr RtlGetVersion = (RtlGetVersionPtr)GetProcAddress(nt_lib, "RtlGetVersion");
|
|
|
|
+ if (RtlGetVersion) {
|
|
|
|
+ RtlGetVersion(&os_ver);
|
|
|
|
+ }
|
|
|
|
+ FreeLibrary(nt_lib);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Load UXTheme.
|
|
HMODULE ux_theme_lib = LoadLibraryW(L"uxtheme.dll");
|
|
HMODULE ux_theme_lib = LoadLibraryW(L"uxtheme.dll");
|
|
if (ux_theme_lib) {
|
|
if (ux_theme_lib) {
|
|
IsDarkModeAllowedForApp = (IsDarkModeAllowedForAppPtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(136));
|
|
IsDarkModeAllowedForApp = (IsDarkModeAllowedForAppPtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(136));
|
|
@@ -3714,6 +3729,9 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
|
GetImmersiveUserColorSetPreference = (GetImmersiveUserColorSetPreferencePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(98));
|
|
GetImmersiveUserColorSetPreference = (GetImmersiveUserColorSetPreferencePtr)GetProcAddress(ux_theme_lib, MAKEINTRESOURCEA(98));
|
|
|
|
|
|
ux_theme_available = IsDarkModeAllowedForApp && ShouldAppsUseDarkMode && GetImmersiveColorFromColorSetEx && GetImmersiveColorTypeFromName && GetImmersiveUserColorSetPreference;
|
|
ux_theme_available = IsDarkModeAllowedForApp && ShouldAppsUseDarkMode && GetImmersiveColorFromColorSetEx && GetImmersiveColorTypeFromName && GetImmersiveUserColorSetPreference;
|
|
|
|
+ if (os_ver.dwBuildNumber >= 22000) {
|
|
|
|
+ dark_title_available = true;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
// Note: Wacom WinTab driver API for pen input, for devices incompatible with Windows Ink.
|
|
// Note: Wacom WinTab driver API for pen input, for devices incompatible with Windows Ink.
|