summaryrefslogtreecommitdiffstats
path: root/src/plugins/platformthemes
diff options
context:
space:
mode:
authorAxel Spoerl <axel.spoerl@qt.io>2022-12-19 08:45:59 +0100
committerAxel Spoerl <axel.spoerl@qt.io>2022-12-28 09:04:21 +0100
commit7b64eb71c0fe68540d97eb22492b4d0b0a647e9f (patch)
tree644036c61afa7c8295c9a2497ac5b7ab1044e633 /src/plugins/platformthemes
parent988c7bfcae5f69f7918f4dacf74e8b1ad2bee9c2 (diff)
Detect appearance by colors unless GTK theme name contains "dark"
QGtk3Theme detects the appearance property by theme name: If the name contains the keyword "dark", the theme is considered to be dark and otherwise light. This detection logic fails, when the GTK theme is dark without containing the "dark" keyword, e.g. the dark theme "Adapta-Nokto". While QGtk3Theme imports the right colors in that case, it wrongly identifies a light theme. This patch adapts the detection logic: If the theme name contains the "dark" keyword, it is considered a dark theme without further checks. If it doesn't, the current GTK3 theme's default background and foreground colors will be read. If the foreground is lighter than the background, the theme is considered dark. If the background is lighter than the foreground, the theme is considered light. If both colors are identical, the appearance will be Qt::Appearance::Unknown. Task-number: QTBUG-93955 Pick-to: 6.5 Change-Id: I0e0f4870a1397b6a7918331a852284bb1c91199e Reviewed-by: Oliver Eftevaag <oliver.eftevaag@qt.io>
Diffstat (limited to 'src/plugins/platformthemes')
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3interface.cpp16
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3interface_p.h3
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3storage.cpp2
3 files changed, 20 insertions, 1 deletions
diff --git a/src/plugins/platformthemes/gtk3/qgtk3interface.cpp b/src/plugins/platformthemes/gtk3/qgtk3interface.cpp
index d3195863af..4ce7d92ceb 100644
--- a/src/plugins/platformthemes/gtk3/qgtk3interface.cpp
+++ b/src/plugins/platformthemes/gtk3/qgtk3interface.cpp
@@ -400,6 +400,22 @@ const QString QGtk3Interface::themeName() const
return QLatin1StringView(theme_name);
}
+Qt::Appearance QGtk3Interface::appearanceByColors() const
+{
+ const QColor background = color(widget(QGtkWidget::gtk_Default),
+ QGtkColorSource::Background,
+ GTK_STATE_FLAG_ACTIVE);
+ const QColor foreground = color(widget(QGtkWidget::gtk_Default),
+ QGtkColorSource::Foreground,
+ GTK_STATE_FLAG_ACTIVE);
+
+ if (foreground.lightness() > background.lightness())
+ return Qt::Appearance::Dark;
+ if (foreground.lightness() < background.lightness())
+ return Qt::Appearance::Light;
+ return Qt::Appearance::Unknown;
+}
+
inline constexpr QGtk3Interface::QGtkWidget QGtk3Interface::toWidgetType(QPlatformTheme::Font type)
{
switch (type) {
diff --git a/src/plugins/platformthemes/gtk3/qgtk3interface_p.h b/src/plugins/platformthemes/gtk3/qgtk3interface_p.h
index 1a44eed6cb..84119cc638 100644
--- a/src/plugins/platformthemes/gtk3/qgtk3interface_p.h
+++ b/src/plugins/platformthemes/gtk3/qgtk3interface_p.h
@@ -99,6 +99,9 @@ public:
// Return current GTK theme name
const QString themeName() const;
+ // Derive appearance from default colors
+ Qt::Appearance appearanceByColors() const;
+
// Convert GTK state to/from string
static int toGtkState(const QString &state);
static const QLatin1String fromGtkState(GtkStateFlags state);
diff --git a/src/plugins/platformthemes/gtk3/qgtk3storage.cpp b/src/plugins/platformthemes/gtk3/qgtk3storage.cpp
index 8c56d88898..de0fea4139 100644
--- a/src/plugins/platformthemes/gtk3/qgtk3storage.cpp
+++ b/src/plugins/platformthemes/gtk3/qgtk3storage.cpp
@@ -222,7 +222,7 @@ void QGtk3Storage::populateMap()
// Derive appearance from theme name
m_appearance = newThemeName.contains("dark"_L1, Qt::CaseInsensitive)
- ? Qt::Appearance::Dark : Qt::Appearance::Light;
+ ? Qt::Appearance::Dark : m_interface->appearanceByColors();
if (m_themeName.isEmpty()) {
qCDebug(lcQGtk3Interface) << "GTK theme initialized:" << newThemeName << m_appearance;