Set color scheme after handling theme change in windows

Setting color scheme before handling theme change provides incorrect
palette color when user switches from light to dark or dark to light.
This is visible when using Fusion style (or other style that supports
dark mode) in Windows. The change has been made as part of patchset
787038bb1d.

It also has to be noted that handling palette changes to make further changes to the palette (or the style sheet), is less likely than
Handling the colorScheme change signal and in this sense, this patch set
can also be considered as an improvement.

This patchset reverts that change and updates color scheme after palette change in the application.

[ChangeLog][QtGui][ColorScheme] Update colorScheme property after
palette change.

Fixes: QTBUG-112653
Pick-to: 6.5 6.6
Change-Id: I71bc413c56663fefdf9fe5871bbb19b7e6c3d9ff
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
This commit is contained in:
Santhosh Kumar 2023-06-14 10:12:35 +02:00 committed by Axel Spoerl
parent fc3ee08737
commit 39882a1354
3 changed files with 5 additions and 4 deletions

View File

@ -2623,12 +2623,13 @@ void QGuiApplicationPrivate::processSafeAreaMarginsChangedEvent(QWindowSystemInt
void QGuiApplicationPrivate::processThemeChanged(QWindowSystemInterfacePrivate::ThemeChangeEvent *tce)
{
QStyleHintsPrivate::get(QGuiApplication::styleHints())->setColorScheme(colorScheme());
if (self)
self->handleThemeChanged();
QIconPrivate::clearIconCache();
QStyleHintsPrivate::get(QGuiApplication::styleHints())->setColorScheme(colorScheme());
QEvent themeChangeEvent(QEvent::ThemeChange);
const QWindowList windows = tce->window ? QWindowList{tce->window} : window_list;
for (auto *window : windows)

View File

@ -320,6 +320,8 @@ public:
static void updatePalette();
static Qt::ColorScheme colorScheme();
protected:
virtual void handleThemeChanged();
@ -336,8 +338,6 @@ private:
friend class QDragManager;
static Qt::ColorScheme colorScheme();
static QGuiApplicationPrivate *self;
static int m_fakeMouseSourcePointId;
#ifdef Q_OS_WIN

View File

@ -4810,7 +4810,7 @@ void QWindowsVistaStyle::polish(QPalette &pal)
{
Q_D(QWindowsVistaStyle);
if (qApp->styleHints()->colorScheme() == Qt::ColorScheme::Dark) {
if (QGuiApplicationPrivate::colorScheme() == Qt::ColorScheme::Dark) {
// System runs in dark mode, but the Vista style cannot use a dark palette.
// Overwrite with the light system palette.
using QWindowsApplication = QNativeInterface::Private::QWindowsApplication;