diff options
author | Mike Krus <mike.krus@kdab.com> | 2019-10-07 18:01:34 +0100 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2019-10-11 07:23:05 +0100 |
commit | 8db80eb521e5a439cb9b499bd17253059b3b340d (patch) | |
tree | b656798152a96508003d4ade0037adc86a9408a5 | |
parent | 4fde5ac2ee2f1a179b5591b19a20e611a486de2d (diff) | |
download | qt3d-8db80eb521e5a439cb9b499bd17253059b3b340d.tar.gz |
Update keyboard handling jobs to use direct sync
Change-Id: I5284594ac1c23e59cf1d55ad90032c8cb89df657
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r-- | src/input/backend/assignkeyboardfocusjob.cpp | 38 | ||||
-rw-r--r-- | src/input/backend/assignkeyboardfocusjob_p.h | 3 | ||||
-rw-r--r-- | src/input/backend/keyboardhandler.cpp | 17 | ||||
-rw-r--r-- | src/input/backend/keyboardhandler_p.h | 1 | ||||
-rw-r--r-- | src/input/backend/keyeventdispatcherjob.cpp | 47 | ||||
-rw-r--r-- | src/input/backend/keyeventdispatcherjob_p.h | 5 | ||||
-rw-r--r-- | src/input/frontend/qkeyboardhandler.cpp | 17 | ||||
-rw-r--r-- | src/input/frontend/qkeyboardhandler.h | 3 |
8 files changed, 78 insertions, 53 deletions
diff --git a/src/input/backend/assignkeyboardfocusjob.cpp b/src/input/backend/assignkeyboardfocusjob.cpp index 385074812..5fe329004 100644 --- a/src/input/backend/assignkeyboardfocusjob.cpp +++ b/src/input/backend/assignkeyboardfocusjob.cpp @@ -38,7 +38,8 @@ ****************************************************************************/ #include "assignkeyboardfocusjob_p.h" - +#include <Qt3DCore/private/qaspectmanager_p.h> +#include <Qt3DInput/qkeyboardhandler.h> #include <Qt3DInput/private/inputhandler_p.h> #include <Qt3DInput/private/inputmanagers_p.h> #include <Qt3DInput/private/job_common_p.h> @@ -50,12 +51,23 @@ QT_BEGIN_NAMESPACE namespace Qt3DInput { namespace Input { +class AssignKeyboardFocusJobPrivate : public Qt3DCore::QAspectJobPrivate +{ +public: + AssignKeyboardFocusJobPrivate() { } + ~AssignKeyboardFocusJobPrivate() override { } + + void postFrame(Qt3DCore::QAspectManager *manager) override; + + QVector<QPair<Qt3DCore::QNodeId, bool>> updates; +}; + AssignKeyboardFocusJob::AssignKeyboardFocusJob(Qt3DCore::QNodeId keyboardDevice) - : QAspectJob() + : QAspectJob(*new AssignKeyboardFocusJobPrivate()) , m_inputHandler(nullptr) , m_keyboardDevice(keyboardDevice) { - SET_JOB_RUN_STAT_TYPE(this, JobTypes::AssignKeyboardFocus, 0); + SET_JOB_RUN_STAT_TYPE(this, JobTypes::AssignKeyboardFocus, 0) } void AssignKeyboardFocusJob::setInputHandler(InputHandler *handler) @@ -65,20 +77,40 @@ void AssignKeyboardFocusJob::setInputHandler(InputHandler *handler) void AssignKeyboardFocusJob::run() { + Q_D(AssignKeyboardFocusJob); + KeyboardDevice *keyboardDevice = m_inputHandler->keyboardDeviceManager()->lookupResource(m_keyboardDevice); const auto handles = m_inputHandler->keyboardInputManager()->activeHandles(); + d->updates.reserve(handles.size()); + for (const HKeyboardHandler &handle : handles) { KeyboardHandler *input = m_inputHandler->keyboardInputManager()->data(handle); Q_ASSERT(input); if (input->keyboardDevice() == m_keyboardDevice) { bool hasFocus = input->peerId() == keyboardDevice->lastKeyboardInputRequester(); input->setFocus(hasFocus); + d->updates.push_back({input->peerId(), hasFocus}); if (hasFocus) keyboardDevice->setCurrentFocusItem(input->peerId()); } } } +void AssignKeyboardFocusJobPrivate::postFrame(Qt3DCore::QAspectManager *manager) +{ + for (const auto &data: qAsConst(updates)) { + QKeyboardHandler *node = qobject_cast<QKeyboardHandler *>(manager->lookupNode(data.first)); + if (!node) + continue; + + const bool b = node->blockNotifications(true); + node->setFocus(data.second); + node->blockNotifications(b); + } + + updates.clear(); +} + } // namespace Input } // namespace Qt3DInput diff --git a/src/input/backend/assignkeyboardfocusjob_p.h b/src/input/backend/assignkeyboardfocusjob_p.h index 8a74de85f..200fd72f1 100644 --- a/src/input/backend/assignkeyboardfocusjob_p.h +++ b/src/input/backend/assignkeyboardfocusjob_p.h @@ -60,6 +60,7 @@ namespace Qt3DInput { namespace Input { class InputHandler; +class AssignKeyboardFocusJobPrivate; class AssignKeyboardFocusJob : public Qt3DCore::QAspectJob { @@ -69,6 +70,8 @@ public: void run() override; private: + Q_DECLARE_PRIVATE(AssignKeyboardFocusJob) + InputHandler *m_inputHandler; const Qt3DCore::QNodeId m_keyboardDevice; }; diff --git a/src/input/backend/keyboardhandler.cpp b/src/input/backend/keyboardhandler.cpp index e96fbb9d2..66af527c9 100644 --- a/src/input/backend/keyboardhandler.cpp +++ b/src/input/backend/keyboardhandler.cpp @@ -76,23 +76,8 @@ void KeyboardHandler::setInputHandler(InputHandler *handler) // Sends a change notification so that the frontend can update itself void KeyboardHandler::setFocus(bool focus) { - if (focus != m_focus) { + if (focus != m_focus) m_focus = focus; - auto e = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId()); - e->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll); - e->setPropertyName("focus"); - e->setValue(m_focus); - notifyObservers(e); - } -} - -void KeyboardHandler::keyEvent(const QKeyEventPtr &event) -{ - auto e = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId()); - e->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll); - e->setPropertyName("event"); - e->setValue(QVariant::fromValue(event)); - notifyObservers(e); } void KeyboardHandler::syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) diff --git a/src/input/backend/keyboardhandler_p.h b/src/input/backend/keyboardhandler_p.h index 903b4d511..a5c13efbf 100644 --- a/src/input/backend/keyboardhandler_p.h +++ b/src/input/backend/keyboardhandler_p.h @@ -71,7 +71,6 @@ public: Qt3DCore::QNodeId keyboardDevice() const; void setInputHandler(InputHandler *handler); void setFocus(bool focus); - void keyEvent(const QKeyEventPtr &event); inline bool focus() const { return m_focus; } diff --git a/src/input/backend/keyeventdispatcherjob.cpp b/src/input/backend/keyeventdispatcherjob.cpp index 6201453fc..26a35e885 100644 --- a/src/input/backend/keyeventdispatcherjob.cpp +++ b/src/input/backend/keyeventdispatcherjob.cpp @@ -38,7 +38,9 @@ ****************************************************************************/ #include "keyeventdispatcherjob_p.h" - +#include <Qt3DCore/private/qaspectmanager_p.h> +#include <Qt3DInput/qkeyboardhandler.h> +#include <Qt3DInput/private/qkeyboardhandler_p.h> #include <Qt3DInput/private/inputhandler_p.h> #include <Qt3DInput/private/inputmanagers_p.h> #include <Qt3DInput/private/job_common_p.h> @@ -49,13 +51,26 @@ QT_BEGIN_NAMESPACE namespace Qt3DInput { namespace Input { +class KeyEventDispatcherJobPrivate : public Qt3DCore::QAspectJobPrivate +{ +public: + KeyEventDispatcherJobPrivate() { } + ~KeyEventDispatcherJobPrivate() override { } + + void postFrame(Qt3DCore::QAspectManager *manager) override; + + Qt3DCore::QNodeId m_keyboardHandler; + QList<QT_PREPEND_NAMESPACE(QKeyEvent)> m_events; +}; + KeyEventDispatcherJob::KeyEventDispatcherJob(Qt3DCore::QNodeId input, const QList<QT_PREPEND_NAMESPACE(QKeyEvent)> &events) - : QAspectJob() + : QAspectJob(*new KeyEventDispatcherJobPrivate) , m_inputHandler(nullptr) - , m_keyboardHandler(input) - , m_events(events) { - SET_JOB_RUN_STAT_TYPE(this, JobTypes::KeyEventDispatcher, 0); + Q_D(KeyEventDispatcherJob); + d->m_keyboardHandler = input; + d->m_events = events; + SET_JOB_RUN_STAT_TYPE(this, JobTypes::KeyEventDispatcher, 0) } void KeyEventDispatcherJob::setInputHandler(InputHandler *handler) @@ -65,12 +80,22 @@ void KeyEventDispatcherJob::setInputHandler(InputHandler *handler) void KeyEventDispatcherJob::run() { - KeyboardHandler *input = m_inputHandler->keyboardInputManager()->lookupResource(m_keyboardHandler); - if (input) - for (const QT_PREPEND_NAMESPACE(QKeyEvent) &e : qAsConst(m_events)) { - // Send events to frontend - input->keyEvent(QKeyEventPtr::create(e)); - } + // NOP +} + +void KeyEventDispatcherJobPrivate::postFrame(Qt3DCore::QAspectManager *manager) +{ + QKeyboardHandler *node = qobject_cast<QKeyboardHandler *>(manager->lookupNode(m_keyboardHandler)); + if (!node) + return; + + QKeyboardHandlerPrivate *dnode = static_cast<QKeyboardHandlerPrivate *>(QKeyboardHandlerPrivate::get(node)); + for (const auto &e: qAsConst(m_events)) { + QKeyEvent ke(e); + dnode->keyEvent(&ke); + } + + m_events.clear(); } } // namespace Input diff --git a/src/input/backend/keyeventdispatcherjob_p.h b/src/input/backend/keyeventdispatcherjob_p.h index be2364ac9..bd0c770d4 100644 --- a/src/input/backend/keyeventdispatcherjob_p.h +++ b/src/input/backend/keyeventdispatcherjob_p.h @@ -61,6 +61,7 @@ namespace Qt3DInput { namespace Input { class InputHandler; +class KeyEventDispatcherJobPrivate; class KeyEventDispatcherJob : public Qt3DCore::QAspectJob { @@ -70,9 +71,9 @@ public: void run() override; private: + Q_DECLARE_PRIVATE(KeyEventDispatcherJob) + InputHandler *m_inputHandler; - const Qt3DCore::QNodeId m_keyboardHandler; - const QList<QT_PREPEND_NAMESPACE(QKeyEvent)> m_events; }; } // namespace Input diff --git a/src/input/frontend/qkeyboardhandler.cpp b/src/input/frontend/qkeyboardhandler.cpp index 485959bcd..aff136a04 100644 --- a/src/input/frontend/qkeyboardhandler.cpp +++ b/src/input/frontend/qkeyboardhandler.cpp @@ -170,23 +170,6 @@ QKeyboardHandler::~QKeyboardHandler() { } -/*! \internal */ -void QKeyboardHandler::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) -{ - Q_D(QKeyboardHandler); - QPropertyUpdatedChangePtr e = qSharedPointerCast<QPropertyUpdatedChange>(change); - if (e->type() == PropertyUpdated) { - if (e->propertyName() == QByteArrayLiteral("focus")) { - bool block = blockNotifications(true); - setFocus(e->value().toBool()); - blockNotifications(block); - } else if (e->propertyName() == QByteArrayLiteral("event")) { - QKeyEventPtr ev = e->value().value<QKeyEventPtr>(); - d->keyEvent(ev.data()); - } - } -} - /*! \qmlproperty KeyboardDevice Qt3D.Input::KeyboardHandler::sourceDevice */ diff --git a/src/input/frontend/qkeyboardhandler.h b/src/input/frontend/qkeyboardhandler.h index 056d7c7a4..d69476286 100644 --- a/src/input/frontend/qkeyboardhandler.h +++ b/src/input/frontend/qkeyboardhandler.h @@ -115,9 +115,6 @@ Q_SIGNALS: void pressed(Qt3DInput::QKeyEvent *event); void released(Qt3DInput::QKeyEvent *event); -protected: - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) override; - private: Q_DECLARE_PRIVATE(QKeyboardHandler) Qt3DCore::QNodeCreatedChangeBasePtr createNodeCreationChange() const override; |