diff options
author | Caolán McNamara <caolanm@redhat.com> | 2023-02-06 20:53:55 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2023-02-08 16:11:25 +0000 |
commit | f7c03364e24da285ea95cea0cc688a7a120fc163 (patch) | |
tree | b6dc20e02654f5144daea807303dbdd71a72bba0 /vcl/win | |
parent | 68ab2e109edf8b81c48e953f7c8d43841e07365a (diff) |
tdf#153229 add a switch to override honoring system dark mode
Change-Id: Iafb6182e05dc65d20d0809476ee58908f7426d39
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146597
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl/win')
-rw-r--r-- | vcl/win/gdi/salnativewidgets-luna.cxx | 49 | ||||
-rw-r--r-- | vcl/win/window/salframe.cxx | 47 |
2 files changed, 71 insertions, 25 deletions
diff --git a/vcl/win/gdi/salnativewidgets-luna.cxx b/vcl/win/gdi/salnativewidgets-luna.cxx index 1cd6245658d6..a0379baa7c6c 100644 --- a/vcl/win/gdi/salnativewidgets-luna.cxx +++ b/vcl/win/gdi/salnativewidgets-luna.cxx @@ -402,16 +402,30 @@ bool UseDarkMode() if (!bOSSupportsDarkMode) return false; - HINSTANCE hUxthemeLib = LoadLibraryExW(L"uxtheme.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32); - if (!hUxthemeLib) - return false; + bool bRet(false); + switch (Application::GetSettings().GetMiscSettings().GetDarkMode()) + { + case 0: // auto + default: + { + HINSTANCE hUxthemeLib = LoadLibraryExW(L"uxtheme.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32); + if (!hUxthemeLib) + return false; - bool bRet = false; - typedef bool(WINAPI* ShouldAppsUseDarkMode_t)(); - if (auto ShouldAppsUseDarkMode = reinterpret_cast<ShouldAppsUseDarkMode_t>(GetProcAddress(hUxthemeLib, MAKEINTRESOURCEA(132)))) - bRet = ShouldAppsUseDarkMode(); + typedef bool(WINAPI* ShouldAppsUseDarkMode_t)(); + if (auto ShouldAppsUseDarkMode = reinterpret_cast<ShouldAppsUseDarkMode_t>(GetProcAddress(hUxthemeLib, MAKEINTRESOURCEA(132)))) + bRet = ShouldAppsUseDarkMode(); - FreeLibrary(hUxthemeLib); + FreeLibrary(hUxthemeLib); + break; + } + case 1: // light + bRet = false; + break; + case 2: // dark + bRet = true; + break; + } return bRet; } @@ -421,7 +435,8 @@ static bool ImplDrawNativeControl( HDC hDC, HTHEME hTheme, RECT rc, ControlPart nPart, ControlState nState, const ImplControlValue& aValue, - OUString const & aCaption ) + OUString const & aCaption, + bool bUseDarkMode ) { // a listbox dropdown is actually a combobox dropdown if( nType == ControlType::Listbox ) @@ -767,7 +782,7 @@ static bool ImplDrawNativeControl( HDC hDC, HTHEME hTheme, RECT rc, { // tabpane in tabcontrols gets drawn in "darkmode" as if it was a // a "light" theme, so bodge this by drawing a frame directly - if (UseDarkMode()) + if (bUseDarkMode) { Color aColor(Application::GetSettings().GetStyleSettings().GetDisableColor()); ScopedHBRUSH hbrush(CreateSolidBrush(RGB(aColor.GetRed(), @@ -783,7 +798,7 @@ static bool ImplDrawNativeControl( HDC hDC, HTHEME hTheme, RECT rc, if( nType == ControlType::TabBody ) { // tabbody in main window gets drawn in white in "darkmode", so bodge this here - if (UseDarkMode()) + if (bUseDarkMode) { Color aColor(Application::GetSettings().GetStyleSettings().GetWindowColor()); ScopedHBRUSH hbrush(CreateSolidBrush(RGB(aColor.GetRed(), @@ -843,7 +858,7 @@ static bool ImplDrawNativeControl( HDC hDC, HTHEME hTheme, RECT rc, // tabitem in tabcontrols gets drawn in "darkmode" as if it was a // a "light" theme, so bodge this by drawing with a button instead - if (UseDarkMode()) + if (bUseDarkMode) { Color aColor; if (iState == TILES_SELECTED) @@ -911,7 +926,7 @@ static bool ImplDrawNativeControl( HDC hDC, HTHEME hTheme, RECT rc, } // toolbar in main window gets drawn in white in "darkmode", so bodge this here - if (UseDarkMode()) + if (bUseDarkMode) { Color aColor(Application::GetSettings().GetStyleSettings().GetWindowColor()); ScopedHBRUSH hbrush(CreateSolidBrush(RGB(aColor.GetRed(), @@ -943,7 +958,7 @@ static bool ImplDrawNativeControl( HDC hDC, HTHEME hTheme, RECT rc, rc.bottom += pValue->maTopDockingAreaHeight; // extend potential gradient to cover docking area as well // menubar in main window gets drawn in white in "darkmode", so bodge this here - if (UseDarkMode()) + if (bUseDarkMode) { Color aColor(Application::GetSettings().GetStyleSettings().GetWindowColor()); ScopedHBRUSH hbrush(CreateSolidBrush(RGB(aColor.GetRed(), @@ -1302,7 +1317,7 @@ bool WinSalGraphics::drawNativeControl( ControlType nType, // set default text alignment int ta = SetTextAlign(getHDC(), TA_LEFT|TA_TOP|TA_NOUPDATECP); - bOk = ImplDrawNativeControl(getHDC(), hTheme, rc, nType, nPart, nState, aValue, aCaptionStr); + bOk = ImplDrawNativeControl(getHDC(), hTheme, rc, nType, nPart, nState, aValue, aCaptionStr, bUseDarkMode); // restore alignment SetTextAlign(getHDC(), ta); @@ -1318,8 +1333,8 @@ bool WinSalGraphics::drawNativeControl( ControlType nType, SetTextAlign(aWhiteDC->getCompatibleHDC(), TA_LEFT|TA_TOP|TA_NOUPDATECP); aWhiteDC->fill(RGB(0xff, 0xff, 0xff)); - if (ImplDrawNativeControl(aBlackDC->getCompatibleHDC(), hTheme, rc, nType, nPart, nState, aValue, aCaptionStr) && - ImplDrawNativeControl(aWhiteDC->getCompatibleHDC(), hTheme, rc, nType, nPart, nState, aValue, aCaptionStr)) + if (ImplDrawNativeControl(aBlackDC->getCompatibleHDC(), hTheme, rc, nType, nPart, nState, aValue, aCaptionStr, bUseDarkMode) && + ImplDrawNativeControl(aWhiteDC->getCompatibleHDC(), hTheme, rc, nType, nPart, nState, aValue, aCaptionStr, bUseDarkMode)) { bOk = pImpl->RenderAndCacheNativeControl(*aWhiteDC, *aBlackDC, cacheRect.Left(), cacheRect.Top(), aControlCacheKey); } diff --git a/vcl/win/window/salframe.cxx b/vcl/win/window/salframe.cxx index 8c43b8448d93..847156f5b2df 100644 --- a/vcl/win/window/salframe.cxx +++ b/vcl/win/window/salframe.cxx @@ -261,6 +261,13 @@ void ImplSalGetWorkArea( HWND hWnd, RECT *pRect, const RECT *pParentRect ) } } +enum PreferredAppMode +{ + AllowDark = 1, + ForceDark = 2, + ForceLight = 3 +}; + static void UpdateDarkMode(HWND hWnd) { static bool bOSSupportsDarkMode = OSSupportsDarkMode(); @@ -271,18 +278,37 @@ static void UpdateDarkMode(HWND hWnd) if (!hUxthemeLib) return; - typedef void(WINAPI* AllowDarkModeForWindow_t)(HWND, BOOL); - if (auto AllowDarkModeForWindow = reinterpret_cast<AllowDarkModeForWindow_t>(GetProcAddress(hUxthemeLib, MAKEINTRESOURCEA(133)))) - AllowDarkModeForWindow(hWnd, TRUE); - - typedef bool(WINAPI* ShouldAppsUseDarkMode_t)(); - if (auto ShouldAppsUseDarkMode = reinterpret_cast<ShouldAppsUseDarkMode_t>(GetProcAddress(hUxthemeLib, MAKEINTRESOURCEA(132)))) + typedef PreferredAppMode(WINAPI* SetPreferredAppMode_t)(PreferredAppMode); + auto SetPreferredAppMode = reinterpret_cast<SetPreferredAppMode_t>(GetProcAddress(hUxthemeLib, MAKEINTRESOURCEA(135))); + if (SetPreferredAppMode) { - BOOL bDarkMode = ShouldAppsUseDarkMode(); - DwmSetWindowAttribute(hWnd, 20, &bDarkMode, sizeof(bDarkMode)); + switch (Application::GetSettings().GetMiscSettings().GetDarkMode()) + { + case 0: + SetPreferredAppMode(AllowDark); + break; + case 1: + SetPreferredAppMode(ForceLight); + break; + case 2: + SetPreferredAppMode(ForceDark); + break; + } } + BOOL bDarkMode = UseDarkMode(); + + typedef void(WINAPI* AllowDarkModeForWindow_t)(HWND, BOOL); + auto AllowDarkModeForWindow = reinterpret_cast<AllowDarkModeForWindow_t>(GetProcAddress(hUxthemeLib, MAKEINTRESOURCEA(133))); + if (AllowDarkModeForWindow) + AllowDarkModeForWindow(hWnd, bDarkMode); + FreeLibrary(hUxthemeLib); + + if (!AllowDarkModeForWindow) + return; + + DwmSetWindowAttribute(hWnd, 20, &bDarkMode, sizeof(bDarkMode)); } SalFrame* ImplSalCreateFrame( WinSalInstance* pInst, @@ -3062,6 +3088,11 @@ void WinSalFrame::EndSetClipRegion() } } +void WinSalFrame::UpdateDarkMode() +{ + ::UpdateDarkMode(mhWnd); +} + static bool ImplHandleMouseMsg( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ) { |