diff options
author | Axel Spoerl <axel.spoerl@qt.io> | 2022-12-19 08:45:59 +0100 |
---|---|---|
committer | Axel Spoerl <axel.spoerl@qt.io> | 2022-12-28 09:04:21 +0100 |
commit | 7b64eb71c0fe68540d97eb22492b4d0b0a647e9f (patch) | |
tree | 644036c61afa7c8295c9a2497ac5b7ab1044e633 /src/plugins/platformthemes | |
parent | 988c7bfcae5f69f7918f4dacf74e8b1ad2bee9c2 (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.cpp | 16 | ||||
-rw-r--r-- | src/plugins/platformthemes/gtk3/qgtk3interface_p.h | 3 | ||||
-rw-r--r-- | src/plugins/platformthemes/gtk3/qgtk3storage.cpp | 2 |
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; |