diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-08-28 17:54:55 +0200 |
---|---|---|
committer | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2023-08-30 11:15:14 +0300 |
commit | cda3432fc154fa5fc8893f3ddc75475691cd3d2e (patch) | |
tree | 48e592924b01cd6612e0ba195120bb8acd41a711 /src | |
parent | dba7531ad6efca9fe5bb8f563138d68b106fc225 (diff) |
Work around QML creating separate singletons for each version
We define our own create() method and make sure to only create one
singleton per engine, no matter the version. Since we cannot do this in
the public header for QVirtualKeyboardInput, we create a QML
registration shim for it in a private header.
Pick-to: 6.6 6.5
Task-number: QTBUG-116432
Change-Id: I53391a92daf0777952401453038d2d523b86b4ef
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src')
4 files changed, 45 insertions, 4 deletions
diff --git a/src/settings/qquickvirtualkeyboardsettings.cpp b/src/settings/qquickvirtualkeyboardsettings.cpp index 1998a1d9..345470f0 100644 --- a/src/settings/qquickvirtualkeyboardsettings.cpp +++ b/src/settings/qquickvirtualkeyboardsettings.cpp @@ -10,6 +10,7 @@ #include <QDir> #include <QRegularExpression> #include <QtCore/private/qobject_p.h> +#include <QtCore/qmutex.h> QT_BEGIN_NAMESPACE namespace QtVirtualKeyboard { @@ -156,10 +157,18 @@ QQuickVirtualKeyboardSettings::QQuickVirtualKeyboardSettings(QQmlEngine *engine, /*! \internal + TODO: Remove this method when QML stops creating separate singleton instances for each version. */ -QQuickVirtualKeyboardSettings *QQuickVirtualKeyboardSettings::create(QQmlEngine *qmlEngine, QJSEngine *) -{ - return new QQuickVirtualKeyboardSettings(qmlEngine); +QQuickVirtualKeyboardSettings *QQuickVirtualKeyboardSettings::create( + QQmlEngine *qmlEngine, QJSEngine *) +{ + static QMutex mutex; + static QHash<QQmlEngine *, QQuickVirtualKeyboardSettings *> instances; + QMutexLocker locker(&mutex); + QQuickVirtualKeyboardSettings *&instance = instances[qmlEngine]; + if (instance == nullptr) + instance = new QQuickVirtualKeyboardSettings(qmlEngine); + return instance; } /*! diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext.h b/src/virtualkeyboard/qvirtualkeyboardinputcontext.h index 3cc05935..15e5877b 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext.h +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext.h @@ -50,7 +50,9 @@ class Q_VIRTUALKEYBOARD_EXPORT QVirtualKeyboardInputContext : public QObject Q_PROPERTY(QVirtualKeyboardObserver *keyboardObserver READ keyboardObserver CONSTANT REVISION(6, 1)) Q_MOC_INCLUDE("qvirtualkeyboardinputengine.h") Q_MOC_INCLUDE("qvirtualkeyboardinputcontext_p.h") - QML_NAMED_ELEMENT(InputContext) + + // The QML macros are unused for now, until we can move the QML_NAMED_ELEMENT back here. + // QML_SINGLETON generates some code that might or might not emit symbols on some platforms. QML_SINGLETON QML_ADDED_IN_VERSION(1, 0) QML_EXTRA_VERSION(2, 0) diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp index e246629b..5d2db42b 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp @@ -18,6 +18,7 @@ #include <QtQuick/qquickwindow.h> #include <QtGui/qpa/qplatformintegration.h> #include <QtGui/private/qguiapplication_p.h> +#include <QQmlEngine> QT_BEGIN_NAMESPACE @@ -642,4 +643,16 @@ void QVirtualKeyboardInputContextPrivate::updateSelectionControlVisible(bool inp } } +QVirtualKeyboardInputContext *QVirtualKeyboardInputContextForeign::create( + QQmlEngine *qmlEngine, QJSEngine *) +{ + static QMutex mutex; + static QHash<QQmlEngine *, QVirtualKeyboardInputContext *> instances; + QMutexLocker locker(&mutex); + QVirtualKeyboardInputContext *&instance = instances[qmlEngine]; + if (instance == nullptr) + instance = new QVirtualKeyboardInputContext(qmlEngine); + return instance; +} + QT_END_NAMESPACE diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h index 4259aa9c..6228cc92 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h @@ -193,6 +193,23 @@ private: Q_DECLARE_OPERATORS_FOR_FLAGS(QVirtualKeyboardInputContextPrivate::StateFlags) +/*! + TODO: Remove this type and move the registration back into QVirtualKeyboardInputContext when + QML stops creating separate singleton instances for each version. + */ +struct QVirtualKeyboardInputContextForeign +{ + Q_GADGET + QML_FOREIGN(QVirtualKeyboardInputContext) + QML_NAMED_ELEMENT(InputContext) + QML_SINGLETON + QML_ADDED_IN_VERSION(1, 0) + QML_EXTRA_VERSION(2, 0) + +public: + static QVirtualKeyboardInputContext *create(QQmlEngine *qmlEngine, QJSEngine *); +}; + QT_END_NAMESPACE Q_DECLARE_METATYPE(QVirtualKeyboardInputContextPrivate::State) |