summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMike Krus <mike.krus@kdab.com>2019-10-07 18:01:34 +0100
committerMike Krus <mike.krus@kdab.com>2019-10-11 07:23:05 +0100
commit8db80eb521e5a439cb9b499bd17253059b3b340d (patch)
treeb656798152a96508003d4ade0037adc86a9408a5 /src
parent4fde5ac2ee2f1a179b5591b19a20e611a486de2d (diff)
Update keyboard handling jobs to use direct sync
Change-Id: I5284594ac1c23e59cf1d55ad90032c8cb89df657 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/input/backend/assignkeyboardfocusjob.cpp38
-rw-r--r--src/input/backend/assignkeyboardfocusjob_p.h3
-rw-r--r--src/input/backend/keyboardhandler.cpp17
-rw-r--r--src/input/backend/keyboardhandler_p.h1
-rw-r--r--src/input/backend/keyeventdispatcherjob.cpp47
-rw-r--r--src/input/backend/keyeventdispatcherjob_p.h5
-rw-r--r--src/input/frontend/qkeyboardhandler.cpp17
-rw-r--r--src/input/frontend/qkeyboardhandler.h3
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;