summaryrefslogtreecommitdiffstats
path: root/src/input
diff options
context:
space:
mode:
authorMäättä Antti <antti.maatta@theqtcompany.com>2016-06-07 11:54:15 +0300
committerAntti Määttä <antti.maatta@qt.io>2016-06-08 08:06:06 +0000
commit3881ed8c19381d8199db842803fb4872ba74dfb9 (patch)
tree30daa274a1d7d7ca3f7696ebde66e7fd8be31e5a /src/input
parentc4999c878bfa6ca3cd1c5dda8afc989cbc265641 (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.cpp9
-rw-r--r--src/input/backend/eventsourcesetterhelper_p.h1
-rw-r--r--src/input/backend/inputhandler.cpp8
-rw-r--r--src/input/backend/inputhandler_p.h1
-rw-r--r--src/input/frontend/qinputsettings.cpp12
-rw-r--r--src/input/frontend/qinputsettings.h3
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