summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm/qwasmtheme.h
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.h
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.h')
-rw-r--r--src/plugins/platforms/wasm/qwasmtheme.h38
1 files changed, 34 insertions, 4 deletions
diff --git a/src/plugins/platforms/wasm/qwasmtheme.h b/src/plugins/platforms/wasm/qwasmtheme.h
index dce1632a5e3..4eaad874c76 100644
--- a/src/plugins/platforms/wasm/qwasmtheme.h
+++ b/src/plugins/platforms/wasm/qwasmtheme.h
@@ -7,6 +7,10 @@
#include <qpa/qplatformtheme.h>
#include <QtGui/QFont>
+#include <memory>
+
+#include <private/qstdweb_p.h>
+
QT_BEGIN_NAMESPACE
class QWasmEventTranslator;
@@ -17,6 +21,30 @@ class QWasmScreen;
class QWasmCompositor;
class QWasmBackingStore;
+// this reflects @media/prefers-contrast
+constexpr auto colorSchemePreferenceDark = "(prefers-color-scheme: dark)";
+constexpr auto contrastPreferenceNoPreference = "(prefers-contrast: no-preference)";
+constexpr auto contrastPreferenceMore = "(prefers-contrast: more)";
+constexpr auto contrastPreferenceLess = "(prefers-contrast: less)";
+constexpr auto contrastPreferenceCustom = "(prefers-contrast: custom)";
+
+template <typename MediaName, typename CallbackFn, typename Container>
+void registerCallbacks(std::initializer_list<MediaName> mediaNames, CallbackFn callback, Container &callbacksContainer)
+{
+ emscripten::val window = emscripten::val::global("window");
+ if (!window.isUndefined()) {
+ for (auto &&mediaName : mediaNames) {
+ auto media = window.call<emscripten::val>("matchMedia", emscripten::val(mediaName));
+ if constexpr (std::is_same_v<Container, std::vector<QWasmEventHandler>>) {
+ callbacksContainer.emplace_back(media, "change", callback);
+ } else {
+ Q_ASSERT(mediaNames.size() == 1);
+ callbacksContainer = QWasmEventHandler(media, "change", callback);
+ }
+ }
+ }
+}
+
class QWasmTheme : public QPlatformTheme
{
public:
@@ -26,19 +54,21 @@ public:
const QPalette *palette(Palette type = SystemPalette) const override;
Qt::ColorScheme colorScheme() const override;
void requestColorScheme(Qt::ColorScheme scheme) override;
+ Qt::ContrastPreference contrastPreference() const override;
QVariant themeHint(ThemeHint hint) const override;
const QFont *font(Font type) const override;
QFont *fixedFont = nullptr;
- static void onColorSchemeChange(emscripten::val event);
+ void onColorSchemeChange();
+ void onContrastPreferenceChange();
private:
Qt::ColorScheme m_colorScheme = Qt::ColorScheme::Unknown;
+ QWasmEventHandler m_colorSchemeChangeCallback;
std::unique_ptr<QPalette> m_palette;
mutable bool m_paletteIsDirty = false;
-
- static Qt::ColorScheme s_autoColorScheme;
- static bool s_autoPaletteIsDirty;
+ Qt::ContrastPreference m_contrastPreference;
+ std::vector<QWasmEventHandler> m_contrastPreferenceChangeCallbacks;
};
QT_END_NAMESPACE