summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm/qwasmtheme.cpp
diff options
context:
space:
mode:
authorPiotr Wiercinski <[email protected]>2025-03-05 21:09:59 +0100
committerPiotr Wiercinski <[email protected]>2025-04-04 13:52:53 +0200
commit8f65024d848144c716a4a6522180a36c518b2e3a (patch)
tree1322872f5bcc9934cd4f2940839ed96c65a82c4c /src/plugins/platforms/wasm/qwasmtheme.cpp
parent9302945ce35c836f97f50ac78bfb74b45824ca59 (diff)
wasm: Add support for contrastPreference detection to WASM theme
Task-number: QTBUG-133596 Change-Id: I4482fe5a3457579867bd870cb2c8d371dd08e1a0 Reviewed-by: Oliver Eftevaag <[email protected]>
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmtheme.cpp')
-rw-r--r--src/plugins/platforms/wasm/qwasmtheme.cpp106
1 files changed, 68 insertions, 38 deletions
diff --git a/src/plugins/platforms/wasm/qwasmtheme.cpp b/src/plugins/platforms/wasm/qwasmtheme.cpp
index 37abb309bff..b9340f31275 100644
--- a/src/plugins/platforms/wasm/qwasmtheme.cpp
+++ b/src/plugins/platforms/wasm/qwasmtheme.cpp
@@ -5,32 +5,55 @@
#include <QtCore/qvariant.h>
#include <QFontDatabase>
#include <QList>
+#include <qloggingcategory.h>
#include <qpa/qwindowsysteminterface.h>
#include <qpalette.h>
-#include <private/qstdweb_p.h>
-
#include <emscripten.h>
#include <emscripten/bind.h>
#include <emscripten/val.h>
Q_GUI_EXPORT QPalette qt_fusionPalette();
-Qt::ColorScheme QWasmTheme::s_autoColorScheme = Qt::ColorScheme::Unknown;
-bool QWasmTheme::s_autoPaletteIsDirty = false;
-
QT_BEGIN_NAMESPACE
+Q_STATIC_LOGGING_CATEGORY(lcQpaThemeWasm, "qt.qpa.theme.wasm")
+
+namespace {
+bool matchMedia(std::string mediaQueryString)
+{
+ return emscripten::val::global("window")
+ .call<emscripten::val>("matchMedia", mediaQueryString)["matches"]
+ .as<bool>();
+}
+
+Qt::ColorScheme getColorSchemeFromMedia()
+{
+ if (matchMedia(colorSchemePreferenceDark)) {
+ return Qt::ColorScheme::Dark;
+ } else {
+ return Qt::ColorScheme::Light;
+ }
+}
+
+Qt::ContrastPreference getContrastPreferenceFromMedia()
+{
+ if (matchMedia(contrastPreferenceMore)) {
+ return Qt::ContrastPreference::HighContrast;
+ } else {
+ return Qt::ContrastPreference::NoPreference;
+ }
+}
+} // namespace
+
using namespace Qt::StringLiterals;
QWasmTheme::QWasmTheme()
{
- if (emscripten::val::global("window").call<emscripten::val>(
- "matchMedia",
- std::string("(prefers-color-scheme:dark)"))["matches"].as<bool>())
- s_autoColorScheme = Qt::ColorScheme::Dark;
- else
- s_autoColorScheme = Qt::ColorScheme::Light;
+ m_colorScheme = getColorSchemeFromMedia();
+ qCDebug(lcQpaThemeWasm) << "Initializing Wasm theme. Color scheme: " << m_colorScheme;
+ m_contrastPreference = getContrastPreferenceFromMedia();
+ qCDebug(lcQpaThemeWasm) << "Initializing Wasm theme. Contrast preference: " << m_contrastPreference;
for (auto family : QFontDatabase::families())
if (QFontDatabase::isFixedPitch(family))
@@ -39,15 +62,15 @@ QWasmTheme::QWasmTheme()
m_palette = std::make_unique<QPalette>();
m_paletteIsDirty = true; // Force update later
- const auto callback = [=](emscripten::val event) { QWasmTheme::onColorSchemeChange(event); };
- const emscripten::val window = emscripten::val::global("window");
- if (!window.isUndefined()) {
- const emscripten::val matchMedia = window.call<emscripten::val>("matchMedia", emscripten::val("(prefers-color-scheme: dark)"));
- if (!matchMedia.isUndefined()) {
- static auto changeEvent =
- std::make_unique<qstdweb::EventCallback>(matchMedia, "change", callback);
- }
- }
+ registerCallbacks(
+ { colorSchemePreferenceDark },
+ [this](emscripten::val) { QWasmTheme::onColorSchemeChange(); },
+ m_colorSchemeChangeCallback);
+ registerCallbacks(
+ { contrastPreferenceNoPreference, contrastPreferenceMore, contrastPreferenceLess,
+ contrastPreferenceCustom },
+ [this](emscripten::val) { QWasmTheme::onContrastPreferenceChange(); },
+ m_contrastPreferenceChangeCallbacks);
}
QWasmTheme::~QWasmTheme()
@@ -59,9 +82,8 @@ QWasmTheme::~QWasmTheme()
const QPalette *QWasmTheme::palette(Palette type) const
{
if (type == SystemPalette) {
- if (m_paletteIsDirty || s_autoPaletteIsDirty) {
+ if (m_paletteIsDirty) {
m_paletteIsDirty = false;
- s_autoPaletteIsDirty = false;
*m_palette = qt_fusionPalette();
}
return m_palette.get();
@@ -71,9 +93,7 @@ const QPalette *QWasmTheme::palette(Palette type) const
Qt::ColorScheme QWasmTheme::colorScheme() const
{
- if (m_colorScheme != Qt::ColorScheme::Unknown)
- return m_colorScheme;
- return s_autoColorScheme;
+ return m_colorScheme;
}
void QWasmTheme::requestColorScheme(Qt::ColorScheme scheme)
@@ -85,6 +105,11 @@ void QWasmTheme::requestColorScheme(Qt::ColorScheme scheme)
}
}
+Qt::ContrastPreference QWasmTheme::contrastPreference() const
+{
+ return m_contrastPreference;
+}
+
QVariant QWasmTheme::themeHint(ThemeHint hint) const
{
if (hint == QPlatformTheme::StyleNames)
@@ -102,20 +127,25 @@ const QFont *QWasmTheme::font(Font type) const
return nullptr;
}
-void QWasmTheme::onColorSchemeChange(emscripten::val event)
+void QWasmTheme::onColorSchemeChange()
{
- const emscripten::val matches = event["matches"];
- if (!matches.isUndefined()) {
- const auto oldAutoColorScheme = s_autoColorScheme;
- if (matches.as<int>())
- s_autoColorScheme = Qt::ColorScheme::Dark;
- else
- s_autoColorScheme = Qt::ColorScheme::Light;
-
- if (oldAutoColorScheme != s_autoColorScheme) {
- s_autoPaletteIsDirty = true;
- QWindowSystemInterface::handleThemeChange<QWindowSystemInterface::SynchronousDelivery>();
- }
+ auto colorScheme = getColorSchemeFromMedia();
+ if (m_colorScheme != colorScheme) {
+ qCDebug(lcQpaThemeWasm) << "Color scheme changed to " << colorScheme;
+ m_colorScheme = colorScheme;
+ m_paletteIsDirty = true;
+ QWindowSystemInterface::handleThemeChange<QWindowSystemInterface::SynchronousDelivery>();
+ }
+}
+
+void QWasmTheme::onContrastPreferenceChange()
+{
+ auto contrastPreference = getContrastPreferenceFromMedia();
+ if (m_contrastPreference != contrastPreference) {
+ qCDebug(lcQpaThemeWasm) << "Contrast preference changed to " << contrastPreference;
+ m_contrastPreference = contrastPreference;
+ m_paletteIsDirty = true;
+ QWindowSystemInterface::handleThemeChange<QWindowSystemInterface::SynchronousDelivery>();
}
}