windows: Fix crash when using a system that reports itself as Windows 17763 or newer, but is missing many of the newer dark mode window functions (Linux Mint Cinnamon w/ Proton 7.0.6)

(cherry picked from commit 0a50b798bf)
This commit is contained in:
Josh Dowell
2025-07-14 01:39:11 +01:00
committed by Sam Lantinga
parent 0e65e04ce1
commit 0d01efca52

View File

@@ -2220,38 +2220,38 @@ bool WIN_SetWindowFocusable(SDL_VideoDevice *_this, SDL_Window *window, bool foc
void WIN_UpdateDarkModeForHWND(HWND hwnd) void WIN_UpdateDarkModeForHWND(HWND hwnd)
{ {
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) #if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
SDL_SharedObject *ntdll = SDL_LoadObject("ntdll.dll"); HMODULE ntdll = LoadLibrary(TEXT("ntdll.dll"));
if (!ntdll) { if (!ntdll) {
return; return;
} }
// There is no function to get Windows build number, so let's get it here via RtlGetVersion // There is no function to get Windows build number, so let's get it here via RtlGetVersion
RtlGetVersion_t RtlGetVersionFunc = (RtlGetVersion_t)SDL_LoadFunction(ntdll, "RtlGetVersion"); RtlGetVersion_t RtlGetVersionFunc = (RtlGetVersion_t)GetProcAddress(ntdll, "RtlGetVersion");
NT_OSVERSIONINFOW os_info; NT_OSVERSIONINFOW os_info;
os_info.dwOSVersionInfoSize = sizeof(NT_OSVERSIONINFOW); os_info.dwOSVersionInfoSize = sizeof(NT_OSVERSIONINFOW);
os_info.dwBuildNumber = 0; os_info.dwBuildNumber = 0;
if (RtlGetVersionFunc) { if (RtlGetVersionFunc) {
RtlGetVersionFunc(&os_info); RtlGetVersionFunc(&os_info);
} }
SDL_UnloadObject(ntdll); FreeLibrary(ntdll);
os_info.dwBuildNumber &= ~0xF0000000; os_info.dwBuildNumber &= ~0xF0000000;
if (os_info.dwBuildNumber < 17763) { if (os_info.dwBuildNumber < 17763) {
// Too old to support dark mode // Too old to support dark mode
return; return;
} }
SDL_SharedObject *uxtheme = SDL_LoadObject("uxtheme.dll"); HMODULE uxtheme = LoadLibrary(TEXT("uxtheme.dll"));
if (!uxtheme) { if (!uxtheme) {
return; return;
} }
RefreshImmersiveColorPolicyState_t RefreshImmersiveColorPolicyStateFunc = (RefreshImmersiveColorPolicyState_t)SDL_LoadFunction(uxtheme, MAKEINTRESOURCEA(104)); RefreshImmersiveColorPolicyState_t RefreshImmersiveColorPolicyStateFunc = (RefreshImmersiveColorPolicyState_t)GetProcAddress(uxtheme, MAKEINTRESOURCEA(104));
ShouldAppsUseDarkMode_t ShouldAppsUseDarkModeFunc = (ShouldAppsUseDarkMode_t)SDL_LoadFunction(uxtheme, MAKEINTRESOURCEA(132)); ShouldAppsUseDarkMode_t ShouldAppsUseDarkModeFunc = (ShouldAppsUseDarkMode_t)GetProcAddress(uxtheme, MAKEINTRESOURCEA(132));
AllowDarkModeForWindow_t AllowDarkModeForWindowFunc = (AllowDarkModeForWindow_t)SDL_LoadFunction(uxtheme, MAKEINTRESOURCEA(133)); AllowDarkModeForWindow_t AllowDarkModeForWindowFunc = (AllowDarkModeForWindow_t)GetProcAddress(uxtheme, MAKEINTRESOURCEA(133));
if (os_info.dwBuildNumber < 18362) { if (os_info.dwBuildNumber < 18362) {
AllowDarkModeForApp_t AllowDarkModeForAppFunc = (AllowDarkModeForApp_t)SDL_LoadFunction(uxtheme, MAKEINTRESOURCEA(135)); AllowDarkModeForApp_t AllowDarkModeForAppFunc = (AllowDarkModeForApp_t)GetProcAddress(uxtheme, MAKEINTRESOURCEA(135));
if (AllowDarkModeForAppFunc) { if (AllowDarkModeForAppFunc) {
AllowDarkModeForAppFunc(true); AllowDarkModeForAppFunc(true);
} }
} else { } else {
SetPreferredAppMode_t SetPreferredAppModeFunc = (SetPreferredAppMode_t)SDL_LoadFunction(uxtheme, MAKEINTRESOURCEA(135)); SetPreferredAppMode_t SetPreferredAppModeFunc = (SetPreferredAppMode_t)GetProcAddress(uxtheme, MAKEINTRESOURCEA(135));
if (SetPreferredAppModeFunc) { if (SetPreferredAppModeFunc) {
SetPreferredAppModeFunc(UXTHEME_APPMODE_ALLOW_DARK); SetPreferredAppModeFunc(UXTHEME_APPMODE_ALLOW_DARK);
} }
@@ -2269,7 +2269,7 @@ void WIN_UpdateDarkModeForHWND(HWND hwnd)
} else { } else {
value = (SDL_GetSystemTheme() == SDL_SYSTEM_THEME_DARK) ? TRUE : FALSE; value = (SDL_GetSystemTheme() == SDL_SYSTEM_THEME_DARK) ? TRUE : FALSE;
} }
SDL_UnloadObject(uxtheme); FreeLibrary(uxtheme);
if (os_info.dwBuildNumber < 18362) { if (os_info.dwBuildNumber < 18362) {
SetProp(hwnd, TEXT("UseImmersiveDarkModeColors"), SDL_reinterpret_cast(HANDLE, SDL_static_cast(INT_PTR, value))); SetProp(hwnd, TEXT("UseImmersiveDarkModeColors"), SDL_reinterpret_cast(HANDLE, SDL_static_cast(INT_PTR, value)));
} else { } else {