diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-01-21 09:39:39 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2016-01-22 14:29:38 +0000 |
commit | 5b9d76185e899082cfe3d989cb3f45029a259202 (patch) | |
tree | 20431c9b305a2b1868cd3405e257f1a99c29cb8e /src | |
parent | 86177b98e27a9d376e35039454986ff7de8f3104 (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.cpp | 8 | ||||
-rw-r--r-- | src/core/aspects/qaspectengine.cpp | 1 | ||||
-rw-r--r-- | src/input/backend/eventsourcesetterhelper.cpp | 21 | ||||
-rw-r--r-- | src/input/backend/eventsourcesetterhelper_p.h | 8 | ||||
-rw-r--r-- | src/input/backend/inputhandler.cpp | 10 | ||||
-rw-r--r-- | src/input/backend/inputhandler_p.h | 1 | ||||
-rw-r--r-- | src/input/frontend/qinputaspect.cpp | 9 |
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() |