@@ -40,28 +40,69 @@ constexpr auto kAppearancePath = "/org/deepin/dde/Appearance1";
4040constexpr auto kAppearanceInterface = " org.deepin.dde.Appearance1" ;
4141constexpr auto kPropertiesInterface = " org.freedesktop.DBus.Properties" ;
4242
43- ColorTheme colorThemeFromGlobalThemeName (const QString &themeName, const ColorTheme &fallbackTheme )
43+ Dtk::Gui::DGuiApplicationHelper::ColorType explicitThemeTypeFromName (const QString &themeName)
4444{
45- if (themeName.endsWith (QStringLiteral (" .dark" ), Qt::CaseInsensitive))
46- return Dark;
45+ const QString normalizedThemeName = themeName.trimmed ().toLower ();
46+ if (normalizedThemeName.isEmpty ())
47+ return Dtk::Gui::DGuiApplicationHelper::UnknownType;
4748
48- if (themeName.endsWith (QStringLiteral (" .light" ), Qt::CaseInsensitive))
49- return Light;
49+ if (normalizedThemeName == QStringLiteral (" dark" )
50+ || normalizedThemeName.endsWith (QStringLiteral (" .dark" ))
51+ || normalizedThemeName.endsWith (QStringLiteral (" -dark" ))
52+ || normalizedThemeName.endsWith (QStringLiteral (" _dark" ))) {
53+ return Dtk::Gui::DGuiApplicationHelper::DarkType;
54+ }
55+
56+ if (normalizedThemeName == QStringLiteral (" light" )
57+ || normalizedThemeName.endsWith (QStringLiteral (" .light" ))
58+ || normalizedThemeName.endsWith (QStringLiteral (" -light" ))
59+ || normalizedThemeName.endsWith (QStringLiteral (" _light" ))) {
60+ return Dtk::Gui::DGuiApplicationHelper::LightType;
61+ }
5062
51- return fallbackTheme ;
63+ return Dtk::Gui::DGuiApplicationHelper::UnknownType ;
5264}
5365
54- Dtk::Gui::DGuiApplicationHelper::ColorType helperThemeTypeFromGlobalThemeName (
55- const QString &themeName,
56- Dtk::Gui::DGuiApplicationHelper::ColorType fallbackTheme)
66+ Dtk::Gui::DGuiApplicationHelper::ColorType currentEffectiveThemeType (Dtk::Gui::DGuiApplicationHelper *helper)
5767{
58- if (themeName.endsWith (QStringLiteral (" .dark" ), Qt::CaseInsensitive))
59- return Dtk::Gui::DGuiApplicationHelper::DarkType;
60-
61- if (themeName.endsWith (QStringLiteral (" .light" ), Qt::CaseInsensitive))
68+ if (!helper)
6269 return Dtk::Gui::DGuiApplicationHelper::LightType;
6370
64- return fallbackTheme;
71+ const auto currentThemeType = helper->themeType ();
72+ if (currentThemeType != Dtk::Gui::DGuiApplicationHelper::UnknownType)
73+ return currentThemeType;
74+
75+ const auto currentPaletteType = helper->paletteType ();
76+ if (currentPaletteType != Dtk::Gui::DGuiApplicationHelper::UnknownType)
77+ return currentPaletteType;
78+
79+ return Dtk::Gui::DGuiApplicationHelper::LightType;
80+ }
81+
82+ Dtk::Gui::DGuiApplicationHelper::ColorType effectiveThemeTypeFromAppearance (
83+ const QString &globalThemeName,
84+ const QString >kThemeName,
85+ const QString &iconThemeName,
86+ Dtk::Gui::DGuiApplicationHelper *helper)
87+ {
88+ const auto globalThemeType = explicitThemeTypeFromName (globalThemeName);
89+ if (globalThemeType != Dtk::Gui::DGuiApplicationHelper::UnknownType)
90+ return globalThemeType;
91+
92+ const auto gtkThemeType = explicitThemeTypeFromName (gtkThemeName);
93+ if (gtkThemeType != Dtk::Gui::DGuiApplicationHelper::UnknownType)
94+ return gtkThemeType;
95+
96+ const auto iconThemeType = explicitThemeTypeFromName (iconThemeName);
97+ if (iconThemeType != Dtk::Gui::DGuiApplicationHelper::UnknownType)
98+ return iconThemeType;
99+
100+ return currentEffectiveThemeType (helper);
101+ }
102+
103+ ColorTheme colorThemeFromHelperThemeType (Dtk::Gui::DGuiApplicationHelper::ColorType themeType)
104+ {
105+ return themeType == Dtk::Gui::DGuiApplicationHelper::DarkType ? Dark : Light;
65106}
66107
67108QString readAppearanceStringProperty (const QString &propertyName)
@@ -87,7 +128,9 @@ void syncApplicationTheme(Dtk::Gui::DGuiApplicationHelper *helper,
87128 if (!helper)
88129 return ;
89130
90- const auto targetThemeType = helperThemeTypeFromGlobalThemeName (globalThemeName, helper->themeType ());
131+ const auto explicitThemeType = explicitThemeTypeFromName (globalThemeName);
132+ const bool followSystemTheme = explicitThemeType == Dtk::Gui::DGuiApplicationHelper::UnknownType;
133+ const auto targetPaletteType = followSystemTheme ? Dtk::Gui::DGuiApplicationHelper::UnknownType : explicitThemeType;
91134
92135 if (auto *applicationTheme = helper->applicationTheme ()) {
93136 const QByteArray gtkThemeNameBytes = gtkThemeName.toUtf8 ();
@@ -101,10 +144,11 @@ void syncApplicationTheme(Dtk::Gui::DGuiApplicationHelper *helper,
101144 }
102145 }
103146
104- if (helper->paletteType () != targetThemeType ) {
105- helper->setPaletteType (targetThemeType );
147+ if (helper->paletteType () != targetPaletteType ) {
148+ helper->setPaletteType (targetPaletteType );
106149 }
107150
151+ const auto targetThemeType = effectiveThemeTypeFromAppearance (globalThemeName, gtkThemeName, iconThemeName, helper);
108152 const QPalette targetPalette = helper->applicationPalette (targetThemeType);
109153 if (helper->applicationPalette () != targetPalette) {
110154 helper->setApplicationPalette (targetPalette);
@@ -353,7 +397,6 @@ void DockPanel::onAppearanceRefreshed(const QString &type)
353397void DockPanel::syncColorThemeWithSystem ()
354398{
355399 auto *guiHelper = Dtk::Gui::DGuiApplicationHelper::instance ();
356- const auto fallbackTheme = static_cast <ColorTheme>(guiHelper->themeType ());
357400 QDBusInterface appearanceProperties (kAppearanceService ,
358401 kAppearancePath ,
359402 kPropertiesInterface ,
@@ -367,13 +410,14 @@ void DockPanel::syncColorThemeWithSystem()
367410 const QString gtkThemeName = readAppearanceStringProperty (QStringLiteral (" GtkTheme" ));
368411 const QString iconThemeName = readAppearanceStringProperty (QStringLiteral (" IconTheme" ));
369412 syncApplicationTheme (guiHelper, globalThemeName, gtkThemeName, iconThemeName);
370- setColorTheme (colorThemeFromGlobalThemeName (globalThemeName, fallbackTheme));
413+ setColorTheme (colorThemeFromHelperThemeType (
414+ effectiveThemeTypeFromAppearance (globalThemeName, gtkThemeName, iconThemeName, guiHelper)));
371415 return ;
372416 }
373417 }
374418
375419 syncApplicationTheme (guiHelper, QString (), QString (), QString ());
376- setColorTheme (fallbackTheme );
420+ setColorTheme (colorThemeFromHelperThemeType ( currentEffectiveThemeType (guiHelper)) );
377421}
378422
379423uint DockPanel::dockSize ()
0 commit comments