diff --git a/src/winmain.c b/src/winmain.c index 8d221b4b..ef1a95d4 100644 --- a/src/winmain.c +++ b/src/winmain.c @@ -183,7 +183,6 @@ trace_winsize(char * tag) #define trace_winsize(tag) #endif - static HRESULT (WINAPI * pDwmIsCompositionEnabled)(BOOL *) = 0; static HRESULT (WINAPI * pDwmExtendFrameIntoClientArea)(HWND, const MARGINS *) = 0; static HRESULT (WINAPI * pDwmEnableBlurBehindWindow)(HWND, void *) = 0; @@ -193,7 +192,8 @@ static HRESULT (WINAPI * pSetWindowCompositionAttribute)(HWND, void *) = 0; static BOOL (WINAPI * pSystemParametersInfo)(UINT, UINT, PVOID, UINT) = 0; static BOOLEAN (WINAPI * pShouldAppsUseDarkMode)(void) = 0; /* undocumented */ -static BOOLEAN (WINAPI * pShouldSystUseDarkMode)(void) = 0; /* undocumented */ +static BOOLEAN (WINAPI * pAllowDarkModeForApp)(BOOLEAN) = 0; /* undocumented */ +static DWORD (WINAPI * pSetPreferredAppMode)(DWORD) = 0; /* undocumented */ static HRESULT (WINAPI * pSetWindowTheme)(HWND, const wchar_t *, const wchar_t *) = 0; #define HTHEME HANDLE @@ -243,8 +243,13 @@ load_dwm_funcs(void) if (uxtheme) { pShouldAppsUseDarkMode = (void *)GetProcAddress(uxtheme, MAKEINTRESOURCEA(132)); /* ordinal */ - pShouldSystUseDarkMode = - (void *)GetProcAddress(uxtheme, MAKEINTRESOURCEA(138)); /* ordinal */ + if (HIWORD(GetVersion()) < 18362) { /* 1903 */ + pAllowDarkModeForApp = + (void *)GetProcAddress(uxtheme, MAKEINTRESOURCEA(135)); /* ordinal */ + } else { + pSetPreferredAppMode = + (void *)GetProcAddress(uxtheme, MAKEINTRESOURCEA(135)); /* ordinal */ + } pSetWindowTheme = (void *)GetProcAddress(uxtheme, "SetWindowTheme"); pOpenThemeData = @@ -4875,6 +4880,15 @@ main(int argc, char *argv[]) } } + // Set app mode + if (pAllowDarkModeForApp || pSetPreferredAppMode) { + if (HIWORD(GetVersion()) < 18362) { + pAllowDarkModeForApp(1); + } else { + pSetPreferredAppMode(1); /* AllowDark */ + } + } + // The window class. class_atom = RegisterClassExW(&(WNDCLASSEXW){ .cbSize = sizeof(WNDCLASSEXW), @@ -4937,19 +4951,20 @@ main(int argc, char *argv[]) trace_winsize("createwindow"); // Dark mode support - if (pShouldSystUseDarkMode) { + if (pShouldAppsUseDarkMode) { HIGHCONTRASTW hc; hc.cbSize = sizeof hc; pSystemParametersInfo(SPI_GETHIGHCONTRAST, sizeof hc, &hc, 0); //printf("High Contrast scheme <%ls>\n", hc.lpszDefaultScheme); - if (!(hc.dwFlags & HCF_HIGHCONTRASTON) && pShouldSystUseDarkMode()) { + if (!(hc.dwFlags & HCF_HIGHCONTRASTON) && pShouldAppsUseDarkMode()) { pSetWindowTheme(wnd, W("DarkMode_Explorer"), NULL); BOOL dark = 1; // set DWMWA_USE_IMMERSIVE_DARK_MODE - pDwmSetWindowAttribute(wnd, 20, &dark, sizeof dark); - pDwmSetWindowAttribute(wnd, 19, &dark, sizeof dark); + if (pDwmSetWindowAttribute(wnd, 20, &dark, sizeof dark)) { + pDwmSetWindowAttribute(wnd, 19, &dark, sizeof dark); + } } }