summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-01-21 09:39:39 +0100
committerPaul Lemire <paul.lemire@kdab.com>2016-01-22 14:29:38 +0000
commit5b9d76185e899082cfe3d989cb3f45029a259202 (patch)
tree20431c9b305a2b1868cd3405e257f1a99c29cb8e /src
parent86177b98e27a9d376e35039454986ff7de8f3104 (diff)
QInputAspect: create EventSourceSetterHelper in main thread
Turns out that on initialize is called in the AspectThread. Since event filters objects need to be created in the same thread as the event source (the main thread), code has to be corrected. Now the eventSourceHelper is created directly by the InputHandler when it is created (as it's created in the main thread). Then onInitialize only takes care of setting the eventFilterService which isn't available before. Change-Id: I2cb18372337793230625f699a2ed51c7331af971 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/core/aspects/qabstractaspect.cpp8
-rw-r--r--src/core/aspects/qaspectengine.cpp1
-rw-r--r--src/input/backend/eventsourcesetterhelper.cpp21
-rw-r--r--src/input/backend/eventsourcesetterhelper_p.h8
-rw-r--r--src/input/backend/inputhandler.cpp10
-rw-r--r--src/input/backend/inputhandler_p.h1
-rw-r--r--src/input/frontend/qinputaspect.cpp9
7 files changed, 42 insertions, 16 deletions
diff --git a/src/core/aspects/qabstractaspect.cpp b/src/core/aspects/qabstractaspect.cpp
index 72ec7c502..fd4f3ec45 100644
--- a/src/core/aspects/qabstractaspect.cpp
+++ b/src/core/aspects/qabstractaspect.cpp
@@ -198,10 +198,18 @@ QVector<QAspectJobPtr> QAbstractAspectPrivate::jobsToExecute(qint64 time)
return q->jobsToExecute(time);
}
+/*!
+ *
+ * Called in the QAspectThread context
+ */
void QAbstractAspect::onStartup()
{
}
+/*!
+ *
+ * Called in the QAspectThread context
+ */
void QAbstractAspect::onShutdown()
{
}
diff --git a/src/core/aspects/qaspectengine.cpp b/src/core/aspects/qaspectengine.cpp
index 7eb26e1d6..11cbfc3e1 100644
--- a/src/core/aspects/qaspectengine.cpp
+++ b/src/core/aspects/qaspectengine.cpp
@@ -168,6 +168,7 @@ void QAspectEnginePrivate::shutdown()
/*!
* Registers a new \a aspect to the AspectManager.
*/
+// Called in the main thread
void QAspectEngine::registerAspect(QAbstractAspect *aspect)
{
Q_D(QAspectEngine);
diff --git a/src/input/backend/eventsourcesetterhelper.cpp b/src/input/backend/eventsourcesetterhelper.cpp
index 81a1114b2..3c73c50d2 100644
--- a/src/input/backend/eventsourcesetterhelper.cpp
+++ b/src/input/backend/eventsourcesetterhelper.cpp
@@ -44,15 +44,21 @@ namespace Qt3DInput {
namespace Input {
-EventSourceSetterHelper::EventSourceSetterHelper(Qt3DCore::QEventFilterService *service,
- InputHandler *inputHandler)
+EventSourceSetterHelper::EventSourceSetterHelper(InputHandler *inputHandler)
: QObject()
- , m_service(service)
+ , m_service(Q_NULLPTR)
, m_inputHandler(inputHandler)
, m_lastEventSource(Q_NULLPTR)
{
}
+// Aspect thread
+void EventSourceSetterHelper::setEventFilterService(Qt3DCore::QEventFilterService *service)
+{
+ QMutexLocker lock(&m_mutex);
+ m_service = service;
+}
+
// Any thread
void EventSourceSetterHelper::setEventSource(QObject *eventSource)
{
@@ -67,9 +73,12 @@ void EventSourceSetterHelper::setEventSource(QObject *eventSource)
// Main Thread
void EventSourceSetterHelper::setEventSourceHelper(QObject *eventSource)
{
- m_service->initialize(eventSource);
- m_inputHandler->registerEventFilters(m_service);
- m_lastEventSource = eventSource;
+ QMutexLocker lock(&m_mutex);
+ if (m_service) {
+ m_service->initialize(eventSource);
+ m_inputHandler->registerEventFilters(m_service);
+ m_lastEventSource = eventSource;
+ }
}
} // Input
diff --git a/src/input/backend/eventsourcesetterhelper_p.h b/src/input/backend/eventsourcesetterhelper_p.h
index ef1a1cf49..e982de87c 100644
--- a/src/input/backend/eventsourcesetterhelper_p.h
+++ b/src/input/backend/eventsourcesetterhelper_p.h
@@ -49,6 +49,7 @@
//
#include <QObject>
+#include <QMutex>
QT_BEGIN_NAMESPACE
@@ -66,8 +67,10 @@ class EventSourceSetterHelper : public QObject
{
Q_OBJECT
public:
- explicit EventSourceSetterHelper(Qt3DCore::QEventFilterService *service,
- InputHandler *m_inputHandler);
+ explicit EventSourceSetterHelper(InputHandler *inputHandler);
+
+ // Called from aspect thread
+ void setEventFilterService(Qt3DCore::QEventFilterService *service);
// Called from any thread
void setEventSource(QObject *eventSource);
@@ -80,6 +83,7 @@ private:
Qt3DCore::QEventFilterService *m_service;
InputHandler *m_inputHandler;
QObject *m_lastEventSource;
+ QMutex m_mutex;
};
} // Input
diff --git a/src/input/backend/inputhandler.cpp b/src/input/backend/inputhandler.cpp
index aa42577dc..e48adb262 100644
--- a/src/input/backend/inputhandler.cpp
+++ b/src/input/backend/inputhandler.cpp
@@ -70,10 +70,13 @@ InputHandler::InputHandler()
, m_logicalDeviceManager(new LogicalDeviceManager())
, m_genericPhysicalDeviceBackendNodeManager(new GenericDeviceBackendNodeManager)
, m_settings(Q_NULLPTR)
- , m_eventSourceSetter(Q_NULLPTR)
+ , m_eventSourceSetter(new Qt3DInput::Input::EventSourceSetterHelper(this))
{
m_keyboardEventFilter->setInputHandler(this);
m_mouseEventFilter->setInputHandler(this);
+
+ // Created in the main thread
+ // m_eventSourceSetter needs to be in the main thread
}
InputHandler::~InputHandler()
@@ -238,6 +241,11 @@ void InputHandler::setEventSourceHelper(EventSourceSetterHelper *helper)
m_eventSourceSetter.reset(helper);
}
+EventSourceSetterHelper *InputHandler::eventSourceHelper() const
+{
+ return m_eventSourceSetter.data();
+}
+
void InputHandler::updateEventSource()
{
if (m_settings != Q_NULLPTR) {
diff --git a/src/input/backend/inputhandler_p.h b/src/input/backend/inputhandler_p.h
index c1b6fe993..51b6ce571 100644
--- a/src/input/backend/inputhandler_p.h
+++ b/src/input/backend/inputhandler_p.h
@@ -133,6 +133,7 @@ public:
void setInputSettings(InputSettings *settings);
void setEventSourceHelper(EventSourceSetterHelper *helper);
+ EventSourceSetterHelper *eventSourceHelper() const;
void updateEventSource();
diff --git a/src/input/frontend/qinputaspect.cpp b/src/input/frontend/qinputaspect.cpp
index 41318e399..c0568bec1 100644
--- a/src/input/frontend/qinputaspect.cpp
+++ b/src/input/frontend/qinputaspect.cpp
@@ -207,20 +207,15 @@ QVector<QAspectJobPtr> QInputAspect::jobsToExecute(qint64 time)
return jobs;
}
-// Called in the aspectThread, we would need this to be called in the main Thread
+// Called in the aspectThread
void QInputAspect::onInitialize()
{
Q_D(QInputAspect);
Qt3DCore::QEventFilterService *eventService = d->services()->eventFilterService();
Q_ASSERT(eventService);
- // TO DO: Create event source setter helper in the main thread
- Qt3DInput::Input::EventSourceSetterHelper *helper =
- new Qt3DInput::Input::EventSourceSetterHelper(eventService,
- d->m_inputHandler.data());
-
// Set it on the input handler which will also handle its lifetime
- d->m_inputHandler->setEventSourceHelper(helper);
+ d->m_inputHandler->eventSourceHelper()->setEventFilterService(eventService);
}
void QInputAspect::onCleanup()