diff options
author | Määttä Antti <antti.maatta@theqtcompany.com> | 2016-06-07 11:54:15 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2016-06-08 08:06:06 +0000 |
commit | 3881ed8c19381d8199db842803fb4872ba74dfb9 (patch) | |
tree | 30daa274a1d7d7ca3f7696ebde66e7fd8be31e5a /src/input | |
parent | c4999c878bfa6ca3cd1c5dda8afc989cbc265641 (diff) |
Fix reset in input event filters in shutdown
The event filters can cause reset if they remain registered while the
scene is being shutdown. If the filters are not unregisteded, they
will continue receiving events when the shutdown deallocates them.
Unregister filters when the scene is being shutdown, except the
eventSource filters, since the eventSource might be already deallocated
by that point. Add connection to eventSource destroyed signal to prevent
this.
Task-number: QTBUG-53834
Change-Id: I1dd1875b98021592580dd59a178ad18308c7d67c
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/input')
-rw-r--r-- | src/input/backend/eventsourcesetterhelper.cpp | 9 | ||||
-rw-r--r-- | src/input/backend/eventsourcesetterhelper_p.h | 1 | ||||
-rw-r--r-- | src/input/backend/inputhandler.cpp | 8 | ||||
-rw-r--r-- | src/input/backend/inputhandler_p.h | 1 | ||||
-rw-r--r-- | src/input/frontend/qinputsettings.cpp | 12 | ||||
-rw-r--r-- | src/input/frontend/qinputsettings.h | 3 |
6 files changed, 34 insertions, 0 deletions
diff --git a/src/input/backend/eventsourcesetterhelper.cpp b/src/input/backend/eventsourcesetterhelper.cpp index 45ca68c39..4ae6cebae 100644 --- a/src/input/backend/eventsourcesetterhelper.cpp +++ b/src/input/backend/eventsourcesetterhelper.cpp @@ -73,6 +73,15 @@ void EventSourceSetterHelper::setEventSource(QObject *eventSource) } } +void EventSourceSetterHelper::unsetEventSource(QObject *eventSource) +{ + if (m_service) { + m_inputHandler->unregisterEventFilters(m_service); + if (eventSource) + m_service->shutdown(eventSource); + } +} + // Main Thread void EventSourceSetterHelper::setEventSourceHelper(QObject *eventSource) { diff --git a/src/input/backend/eventsourcesetterhelper_p.h b/src/input/backend/eventsourcesetterhelper_p.h index 8b2538a91..97776dc9b 100644 --- a/src/input/backend/eventsourcesetterhelper_p.h +++ b/src/input/backend/eventsourcesetterhelper_p.h @@ -77,6 +77,7 @@ public: // Called from any thread void setEventSource(QObject *eventSource); + void unsetEventSource(QObject *eventSource); private Q_SLOTS: // Called in main thread diff --git a/src/input/backend/inputhandler.cpp b/src/input/backend/inputhandler.cpp index 6208c902f..51e94b1bd 100644 --- a/src/input/backend/inputhandler.cpp +++ b/src/input/backend/inputhandler.cpp @@ -112,6 +112,12 @@ void InputHandler::registerEventFilters(QEventFilterService *service) service->registerEventFilter(m_mouseEventFilter, 513); } +void InputHandler::unregisterEventFilters(Qt3DCore::QEventFilterService *service) +{ + service->unregisterEventFilter(m_keyboardEventFilter); + service->unregisterEventFilter(m_mouseEventFilter); +} + // Called by the keyboardEventFilter in the main thread void InputHandler::appendKeyEvent(const QT_PREPEND_NAMESPACE(QKeyEvent) &event) { @@ -271,6 +277,8 @@ void InputHandler::addInputDeviceIntegration(QInputDeviceIntegration *inputInteg void InputHandler::setInputSettings(InputSettings *settings) { + if (m_settings && settings == nullptr) + m_eventSourceSetter->unsetEventSource(m_settings->eventSource()); m_settings = settings; } diff --git a/src/input/backend/inputhandler_p.h b/src/input/backend/inputhandler_p.h index 53dda814d..72078b54c 100644 --- a/src/input/backend/inputhandler_p.h +++ b/src/input/backend/inputhandler_p.h @@ -176,6 +176,7 @@ private: QScopedPointer<EventSourceSetterHelper> m_eventSourceSetter; void registerEventFilters(Qt3DCore::QEventFilterService *service); + void unregisterEventFilters(Qt3DCore::QEventFilterService *service); friend class EventSourceSetterHelper; }; diff --git a/src/input/frontend/qinputsettings.cpp b/src/input/frontend/qinputsettings.cpp index fd2261e3d..14e3556aa 100644 --- a/src/input/frontend/qinputsettings.cpp +++ b/src/input/frontend/qinputsettings.cpp @@ -102,11 +102,23 @@ void QInputSettings::setEventSource(QObject *eventSource) { Q_D(QInputSettings); if (d->m_eventSource != eventSource) { + if (d->m_eventSource) + QObject::disconnect(m_connection); d->m_eventSource = eventSource; emit eventSourceChanged(eventSource); + m_connection = QObject::connect(eventSource, &QObject::destroyed, + this, &QInputSettings::eventSourceDestroyed); } } +void QInputSettings::eventSourceDestroyed() +{ + Q_D(QInputSettings); + QObject::disconnect(m_connection); + d->m_eventSource = nullptr; + emit eventSourceChanged(nullptr); +} + Qt3DCore::QNodeCreatedChangeBasePtr QInputSettings::createNodeCreationChange() const { auto creationChange = Qt3DCore::QNodeCreatedChangePtr<QInputSettingsData>::create(this); diff --git a/src/input/frontend/qinputsettings.h b/src/input/frontend/qinputsettings.h index 8eb3b6bf2..2fb3651c3 100644 --- a/src/input/frontend/qinputsettings.h +++ b/src/input/frontend/qinputsettings.h @@ -68,6 +68,9 @@ Q_SIGNALS: private: Q_DECLARE_PRIVATE(QInputSettings) Qt3DCore::QNodeCreatedChangeBasePtr createNodeCreationChange() const Q_DECL_OVERRIDE; + void eventSourceDestroyed(); + + QMetaObject::Connection m_connection; }; } // Qt3DInput |