diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 0c61640bcbb..ba77cb1cccc 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -90,6 +90,7 @@ qt_internal_add_module(Gui image/qppmhandler.cpp image/qppmhandler_p.h image/qxbmhandler.cpp image/qxbmhandler_p.h image/qxpmhandler.cpp image/qxpmhandler_p.h + kernel/qaccessibilityhints.cpp kernel/qaccessibilityhints.h kernel/qaccessibilityhints_p.h kernel/qclipboard.cpp kernel/qclipboard.h kernel/qcursor.cpp kernel/qcursor.h kernel/qcursor_p.h kernel/qeventpoint.cpp kernel/qeventpoint.h kernel/qeventpoint_p.h diff --git a/src/gui/kernel/qaccessibilityhints.cpp b/src/gui/kernel/qaccessibilityhints.cpp new file mode 100644 index 00000000000..0d072550004 --- /dev/null +++ b/src/gui/kernel/qaccessibilityhints.cpp @@ -0,0 +1,61 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qaccessibilityhints.h" +#include "qaccessibilityhints_p.h" + +QT_BEGIN_NAMESPACE + +void QAccessibilityHintsPrivate::updateContrastPreference(Qt::ContrastPreference contrastPreference) +{ + if (m_contrastPreference == contrastPreference) + return; + m_contrastPreference = contrastPreference; + + Q_Q(QAccessibilityHints); + emit q->contrastPreferenceChanged(contrastPreference); +} + +QAccessibilityHintsPrivate *QAccessibilityHintsPrivate::get(QAccessibilityHints *q) +{ + Q_ASSERT(q); + return q->d_func(); +} + +/*! + \class QAccessibilityHints + \since 6.10 + \brief The QAccessibilityHints class contains platform specific accessibility hints and settings. + \inmodule QtGui + + This class bundles together platform specific accessibility settings, and can be accessed from + \l QStyleHints::accessibility. + + \sa QStyleHints +*/ + +QAccessibilityHints::QAccessibilityHints(QObject *parent) + : QObject(*(new QAccessibilityHintsPrivate), parent) +{} + +/*! + \property QAccessibilityHints::contrastPreference + \brief The contrast mode set by the system. + + This property can be used by the application to determine what contrast settings the system + is currently using. + + Qt styles use this property in order to adjust palette colors and outlines. + + \sa Qt::ColorScheme, QGuiApplication::palette(), QEvent::PaletteChange + \since 6.10 +*/ +Qt::ContrastPreference QAccessibilityHints::contrastPreference() const +{ + Q_D(const QAccessibilityHints); + return d->m_contrastPreference; +} + +QT_END_NAMESPACE + +#include "moc_qaccessibilityhints.cpp" diff --git a/src/gui/kernel/qaccessibilityhints.h b/src/gui/kernel/qaccessibilityhints.h new file mode 100644 index 00000000000..c0d5908a23f --- /dev/null +++ b/src/gui/kernel/qaccessibilityhints.h @@ -0,0 +1,30 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QACCESSIBILITYHINTS_H +#define QACCESSIBILITYHINTS_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QAccessibilityHintsPrivate; + +class Q_GUI_EXPORT QAccessibilityHints : public QObject +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QAccessibilityHints) + Q_PROPERTY(Qt::ContrastPreference contrastPreference READ contrastPreference NOTIFY contrastPreferenceChanged FINAL REVISION(6, 10)) + +public: + explicit QAccessibilityHints(QObject *parent = nullptr); + Qt::ContrastPreference contrastPreference() const; + +Q_SIGNALS: + void contrastPreferenceChanged(Qt::ContrastPreference contrastPreference); +}; + +QT_END_NAMESPACE + +#endif // QACCESSIBILITYHINTS_H diff --git a/src/gui/kernel/qaccessibilityhints_p.h b/src/gui/kernel/qaccessibilityhints_p.h new file mode 100644 index 00000000000..49033f7aa11 --- /dev/null +++ b/src/gui/kernel/qaccessibilityhints_p.h @@ -0,0 +1,37 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QACCESSIBILITYHINTS_P_H +#define QACCESSIBILITYHINTS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qaccessibilityhints.h" + +#include + +QT_BEGIN_NAMESPACE + +class QAccessibilityHintsPrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QAccessibilityHints) +public: + void updateContrastPreference(Qt::ContrastPreference contrastPreference); + + static QAccessibilityHintsPrivate *get(QAccessibilityHints *q); +private: + Qt::ContrastPreference m_contrastPreference = Qt::ContrastPreference::NoPreference; +}; + +QT_END_NAMESPACE + +#endif // QACCESSIBILITYHINTS_P_H diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 3630537de26..3a494d6406a 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -1589,8 +1589,7 @@ void QGuiApplicationPrivate::createPlatformIntegration() Q_UNUSED(platformExplicitlySelected); init_platform(QLatin1StringView(platformName), platformPluginPath, platformThemeName, argc, argv); - if (const QPlatformTheme *theme = platformTheme()) - QStyleHintsPrivate::get(QGuiApplication::styleHints())->updateColorScheme(theme->colorScheme()); + QStyleHintsPrivate::get(QGuiApplication::styleHints())->update(platformTheme()); if (!icon.isEmpty()) forcedWindowIcon = QDir::isAbsolutePath(icon) ? QIcon(icon) : QIcon::fromTheme(icon); @@ -2820,10 +2819,7 @@ void QGuiApplicationPrivate::processThemeChanged(QWindowSystemInterfacePrivate:: void QGuiApplicationPrivate::handleThemeChanged() { - const auto newColorScheme = platformTheme() ? platformTheme()->colorScheme() - : Qt::ColorScheme::Unknown; - QStyleHintsPrivate::get(QGuiApplication::styleHints())->updateColorScheme(newColorScheme); - + QStyleHintsPrivate::get(QGuiApplication::styleHints())->update(platformTheme()); updatePalette(); QIconLoader::instance()->updateSystemTheme(); diff --git a/src/gui/kernel/qstylehints.cpp b/src/gui/kernel/qstylehints.cpp index 174aa10be23..677567865f1 100644 --- a/src/gui/kernel/qstylehints.cpp +++ b/src/gui/kernel/qstylehints.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#include "qaccessibilityhints_p.h" #include #include "qstylehints_p.h" #include @@ -178,6 +179,22 @@ void QStyleHints::setColorScheme(Qt::ColorScheme scheme) */ +/*! + \property QStyleHints::accessibility + \brief The application's accessibility hints. + + The accessibility hints encapsulates platform dependent accessibility settings + such as whether the user wishes the application to be in high contrast or not. + + \sa QAccessibilityHints + \since 6.10 +*/ +const QAccessibilityHints *QStyleHints::accessibility() const +{ + Q_D(const QStyleHints); + return d->accessibilityHints(); +} + /*! Sets the \a mousePressAndHoldInterval. \internal @@ -705,6 +722,26 @@ void QStyleHintsPrivate::updateColorScheme(Qt::ColorScheme colorScheme) emit q->colorSchemeChanged(colorScheme); } +/*! + \internal + + Helper function that updates the style hints when the theme changes +*/ +void QStyleHintsPrivate::update(const QPlatformTheme *theme) +{ + Q_ASSERT(theme); + updateColorScheme(theme->colorScheme()); + QAccessibilityHintsPrivate::get(accessibilityHints())->updateContrastPreference(theme->contrastPreference()); +} + +QAccessibilityHints *QStyleHintsPrivate::accessibilityHints() const +{ + Q_Q(const QStyleHints); + if (!m_accessibilityHints) + const_cast(this)->m_accessibilityHints = new QAccessibilityHints(const_cast(q)); + return m_accessibilityHints; +} + QStyleHintsPrivate *QStyleHintsPrivate::get(QStyleHints *q) { Q_ASSERT(q); diff --git a/src/gui/kernel/qstylehints.h b/src/gui/kernel/qstylehints.h index 0f68f544ac6..31b8eea6f6d 100644 --- a/src/gui/kernel/qstylehints.h +++ b/src/gui/kernel/qstylehints.h @@ -9,9 +9,9 @@ QT_BEGIN_NAMESPACE - class QPlatformIntegration; class QStyleHintsPrivate; +class QAccessibilityHints; class Q_GUI_EXPORT QStyleHints : public QObject { @@ -57,6 +57,7 @@ class Q_GUI_EXPORT QStyleHints : public QObject Q_PROPERTY(Qt::ColorScheme colorScheme READ colorScheme WRITE setColorScheme RESET unsetColorScheme NOTIFY colorSchemeChanged FINAL) Q_PROPERTY(bool menuSelectionWraps READ menuSelectionWraps STORED false CONSTANT FINAL REVISION(6, 10)) + Q_PROPERTY(const QAccessibilityHints* accessibility READ accessibility CONSTANT FINAL REVISION(6, 10)) public: void setMouseDoubleClickInterval(int mouseDoubleClickInterval); @@ -103,6 +104,7 @@ public: Qt::ColorScheme colorScheme() const; void setColorScheme(Qt::ColorScheme scheme); void unsetColorScheme() { setColorScheme(Qt::ColorScheme::Unknown); } + const QAccessibilityHints* accessibility() const; Q_SIGNALS: void cursorFlashTimeChanged(int cursorFlashTime); diff --git a/src/gui/kernel/qstylehints_p.h b/src/gui/kernel/qstylehints_p.h index 497bf95cbf4..e4949fbeee9 100644 --- a/src/gui/kernel/qstylehints_p.h +++ b/src/gui/kernel/qstylehints_p.h @@ -19,6 +19,7 @@ #include #include #include "qstylehints.h" +#include "qaccessibilityhints.h" QT_BEGIN_NAMESPACE @@ -43,11 +44,15 @@ public: Qt::ColorScheme colorScheme() const { return m_colorScheme; } void updateColorScheme(Qt::ColorScheme colorScheme); + void update(const QPlatformTheme *theme); + + QAccessibilityHints *accessibilityHints() const; static QStyleHintsPrivate *get(QStyleHints *q); private: Qt::ColorScheme m_colorScheme = Qt::ColorScheme::Unknown; + QAccessibilityHints* m_accessibilityHints = nullptr; }; QT_END_NAMESPACE