Windows: Reevaluate dark frames if the application palette changes

Since 5ea7e3a8111b2939f0c91b750aa1c62ab16ab715 we are using dark window
frames if the default palette is dark, unless applications explicitly
override dark frame support.

If the palette changes during runtime, we didn't reevaluate that
setting. Do that by handling ApplicationPaletteChange events in
QWindowsWindow. We still have to respect an explicit opt-out.

Simplify the code at the call sites of setDarkBorder(), we don't need
to check all the time whether the application has opted out of dark
frame support.

Pick-to: 6.4
Task-number: QTBUG-72028
Change-Id: I94e7d33cd21f9656ca210b43e775f487abc25b54
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Volker Hilsheimer 2022-11-25 13:54:06 +01:00 committed by Tor Arne Vestbø
parent f0cd18706f
commit f32aa06f4f

View File

@ -849,8 +849,9 @@ static inline bool shouldApplyDarkFrame(const QWindow *w)
{
if (!w->isTopLevel() || w->flags().testFlag(Qt::FramelessWindowHint))
return false;
if (QWindowsIntegration::instance()->darkModeHandling().testFlag(QWindowsApplication::DarkModeStyle))
return true;
// the application has explicitly opted out of dark frames
if (!QWindowsIntegration::instance()->darkModeHandling().testFlag(QWindowsApplication::DarkModeWindowFrames))
return false;
// if the application supports a dark border, and the palette is dark (window background color
// is darker than the text), then turn dark-border support on, otherwise use a light border.
const QPalette defaultPalette;
@ -925,11 +926,8 @@ QWindowsWindowData
return result;
}
if (QWindowsContext::isDarkMode()
&& QWindowsIntegration::instance()->darkModeHandling().testFlag(QWindowsApplication::DarkModeWindowFrames)
&& shouldApplyDarkFrame(w)) {
QWindowsWindow::setDarkBorderToWindow(result.hwnd, true);
}
QWindowsWindow::setDarkBorderToWindow(result.hwnd, QWindowsContext::isDarkMode()
&& shouldApplyDarkFrame(w));
if (mirrorParentWidth != 0) {
context->obtainedPos.setX(mirrorParentWidth - context->obtainedSize.width()
@ -2606,6 +2604,9 @@ void QWindowsWindow::setExStyle(unsigned s) const
bool QWindowsWindow::windowEvent(QEvent *event)
{
switch (event->type()) {
case QEvent::ApplicationPaletteChange:
setDarkBorder(QWindowsContext::isDarkMode());
break;
case QEvent::WindowBlocked: // Blocked by another modal window.
setEnabled(false);
setFlag(BlockedByModal);
@ -3177,8 +3178,12 @@ bool QWindowsWindow::setDarkBorderToWindow(HWND hwnd, bool d)
void QWindowsWindow::setDarkBorder(bool d)
{
if (shouldApplyDarkFrame(window()) && queryDarkBorder(m_data.hwnd) != d)
setDarkBorderToWindow(m_data.hwnd, d);
// respect explicit opt-out and incompatible palettes or styles
d = d && shouldApplyDarkFrame(window());
if (queryDarkBorder(m_data.hwnd) == d)
return;
setDarkBorderToWindow(m_data.hwnd, d);
}
QWindowsMenuBar *QWindowsWindow::menuBar() const