macOS: Force light appearance before saving system palette

When using a light theme while macOS is in dark mode, we need to first
force the application appearance to be light, before saving the system
palette. Otherwise the system palette will contain colors from the dark
system appearance.

Fixes: QTCREATORBUG-21520
Fixes: QTCREATORBUG-26427
Fixes: QTCREATORBUG-26428
Change-Id: Icf802093de17715d16db5c5735b133f2fc465436
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Eike Ziller
2021-10-25 15:46:33 +02:00
parent 0fc1bb6187
commit d977db303d
3 changed files with 25 additions and 10 deletions

View File

@@ -67,6 +67,18 @@ void setThemeApplicationPalette()
QApplication::setPalette(m_creatorTheme->palette());
}
static void maybeForceMacOSLight(Theme *theme)
{
#ifdef Q_OS_MACOS
// Match the native UI theme and palette with the creator
// theme by forcing light aqua for light creator themes.
if (theme && !theme->flag(Theme::DarkUserInterface))
Internal::forceMacOSLightAquaApperance();
#else
Q_UNUSED(theme)
#endif
}
void setCreatorTheme(Theme *theme)
{
if (m_creatorTheme == theme)
@@ -74,13 +86,7 @@ void setCreatorTheme(Theme *theme)
delete m_creatorTheme;
m_creatorTheme = theme;
#ifdef Q_OS_MACOS
// Match the native UI theme and palette with the creator
// theme by forcing light aqua for light creator themes.
if (theme && !theme->flag(Theme::DarkUserInterface))
Internal::forceMacOSLightAquaApperance();
#endif
maybeForceMacOSLight(theme);
setThemeApplicationPalette();
}
@@ -270,6 +276,12 @@ static QPalette copyPalette(const QPalette &p)
return res;
}
void Theme::setInitialPalette(Theme *initTheme)
{
maybeForceMacOSLight(initTheme);
initialPalette();
}
QPalette Theme::initialPalette()
{
static QPalette palette = copyPalette(QApplication::palette());

View File

@@ -481,6 +481,8 @@ public:
static bool systemUsesDarkMode();
static QPalette initialPalette();
static void setInitialPalette(Theme *initTheme);
protected:
Theme(Theme *originTheme, QObject *parent = nullptr);
ThemePrivate *d;

View File

@@ -160,10 +160,11 @@ bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage)
return false;
}
const CoreArguments args = parseArguments(arguments);
Theme::initialPalette(); // Initialize palette before setting it
Theme *themeFromArg = ThemeEntry::createTheme(args.themeId);
setCreatorTheme(themeFromArg ? themeFromArg
: ThemeEntry::createTheme(ThemeEntry::themeSetting()));
Theme *theme = themeFromArg ? themeFromArg
: ThemeEntry::createTheme(ThemeEntry::themeSetting());
Theme::setInitialPalette(theme); // Initialize palette before setting it
setCreatorTheme(theme);
InfoBar::initialize(ICore::settings());
new ActionManager(this);
ActionManager::setPresentationModeEnabled(args.presentationMode);