aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-08-28 17:54:55 +0200
committerJarkko Koivikko <jarkko.koivikko@code-q.fi>2023-08-30 11:15:14 +0300
commitcda3432fc154fa5fc8893f3ddc75475691cd3d2e (patch)
tree48e592924b01cd6612e0ba195120bb8acd41a711 /src
parentdba7531ad6efca9fe5bb8f563138d68b106fc225 (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')
-rw-r--r--src/settings/qquickvirtualkeyboardsettings.cpp15
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputcontext.h4
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp13
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h17
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)