summaryrefslogtreecommitdiff
path: root/vcl/win
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2023-02-06 20:53:55 +0000
committerCaolán McNamara <caolanm@redhat.com>2023-02-08 16:11:25 +0000
commitf7c03364e24da285ea95cea0cc688a7a120fc163 (patch)
treeb6dc20e02654f5144daea807303dbdd71a72bba0 /vcl/win
parent68ab2e109edf8b81c48e953f7c8d43841e07365a (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.cxx49
-rw-r--r--vcl/win/window/salframe.cxx47
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 )
{