diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-04-21 15:26:21 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-04-21 17:28:01 +0000 |
commit | e91d2339379ef1f6798b28f1247e20478cf7cf18 (patch) | |
tree | ad9242b23b90b0270bd7cc780c7dc27e0ea742c9 | |
parent | c8b021896accbf8fea4779a3812bbddae09e881f (diff) |
Add Mouse Wheel event handling in the backend
Change-Id: If567e20140b80f12611a815703b75f3b7c5115fb
Task-number: QTBUG-52243
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/input/backend/inputhandler.cpp | 45 | ||||
-rw-r--r-- | src/input/backend/inputhandler_p.h | 14 | ||||
-rw-r--r-- | src/input/backend/keyboarddevice.cpp | 2 | ||||
-rw-r--r-- | src/input/backend/keyeventdispatcherjob.cpp | 2 | ||||
-rw-r--r-- | src/input/backend/mousedevice.cpp | 2 | ||||
-rw-r--r-- | src/input/backend/mouseeventdispatcherjob.cpp | 14 | ||||
-rw-r--r-- | src/input/backend/mouseeventdispatcherjob_p.h | 7 | ||||
-rw-r--r-- | src/input/backend/mouseeventfilter.cpp | 6 |
8 files changed, 64 insertions, 28 deletions
diff --git a/src/input/backend/inputhandler.cpp b/src/input/backend/inputhandler.cpp index 4bcb233d5..5d8a8e45f 100644 --- a/src/input/backend/inputhandler.cpp +++ b/src/input/backend/inputhandler.cpp @@ -99,23 +99,21 @@ void InputHandler::registerEventFilters(QEventFilterService *service) void InputHandler::appendKeyEvent(const QT_PREPEND_NAMESPACE(QKeyEvent) &event) { QMutexLocker lock(&m_mutex); - m_pendingEvents.append(event); + m_pendingKeyEvents.append(event); } // Called by QInputASpect::jobsToExecute (aspectThread) QList<QT_PREPEND_NAMESPACE(QKeyEvent)> InputHandler::pendingKeyEvents() { QMutexLocker lock(&m_mutex); - QList<QT_PREPEND_NAMESPACE(QKeyEvent)> pendingEvents = m_pendingEvents; - m_pendingEvents.clear(); - return pendingEvents; + return std::move(m_pendingKeyEvents); } // Called by QInputASpect::jobsToExecute (aspectThread) void InputHandler::clearPendingKeyEvents() { QMutexLocker lock(&m_mutex); - m_pendingEvents.clear(); + m_pendingKeyEvents.clear(); } void InputHandler::appendMouseEvent(const QT_PREPEND_NAMESPACE(QMouseEvent) &event) @@ -127,9 +125,7 @@ void InputHandler::appendMouseEvent(const QT_PREPEND_NAMESPACE(QMouseEvent) &eve QList<QT_PREPEND_NAMESPACE(QMouseEvent)> InputHandler::pendingMouseEvents() { QMutexLocker lock(&m_mutex); - QList<QT_PREPEND_NAMESPACE(QMouseEvent)> pendingEvents = m_pendingMouseEvents; - m_pendingMouseEvents.clear(); - return pendingEvents; + return std::move(m_pendingMouseEvents); } void InputHandler::clearPendingMouseEvents() @@ -138,6 +134,25 @@ void InputHandler::clearPendingMouseEvents() m_pendingMouseEvents.clear(); } +void InputHandler::appendWheelEvent(const QT_PREPEND_NAMESPACE(QWheelEvent) &event) +{ + QMutexLocker lock(&m_mutex); + m_pendingWheelEvents.append(event); +} + +QList<QT_PREPEND_NAMESPACE (QWheelEvent)> Qt3DInput::Input::InputHandler::pendingWheelEvents() +{ + QMutexLocker lock(&m_mutex); + return std::move(m_pendingWheelEvents); +} + +void InputHandler::clearPendingWheelEvents() +{ + QMutexLocker lock(&m_mutex); + m_pendingWheelEvents.clear(); +} + + void InputHandler::appendKeyboardDevice(HKeyboardDevice device) { m_activeKeyboardDevices.append(device); @@ -204,16 +219,20 @@ QVector<Qt3DCore::QAspectJobPtr> InputHandler::keyboardJobs() QVector<Qt3DCore::QAspectJobPtr> InputHandler::mouseJobs() { QVector<QAspectJobPtr> jobs; - const QList<QT_PREPEND_NAMESPACE(QMouseEvent)> events = pendingMouseEvents(); + const QList<QT_PREPEND_NAMESPACE(QMouseEvent)> mouseEvents = pendingMouseEvents(); + const QList<QT_PREPEND_NAMESPACE(QWheelEvent)> wheelEvents = pendingWheelEvents(); Q_FOREACH (const HMouseDevice cHandle, m_activeMouseDevices) { MouseDevice *controller = m_mouseDeviceManager->data(cHandle); - controller->updateMouseEvents(events); + controller->updateMouseEvents(mouseEvents); // Event dispacthing job - if (!events.isEmpty()) { - Q_FOREACH (QNodeId input, controller->mouseInputs()) { - MouseEventDispatcherJob *job = new MouseEventDispatcherJob(input, events); + if (!mouseEvents.isEmpty() || !wheelEvents.empty()) { + const QVector<Qt3DCore::QNodeId> mouseInputs = controller->mouseInputs(); + for (QNodeId input : mouseInputs) { + MouseEventDispatcherJob *job = new MouseEventDispatcherJob(input, + mouseEvents, + wheelEvents); job->setInputHandler(this); jobs.append(QAspectJobPtr(job)); } diff --git a/src/input/backend/inputhandler_p.h b/src/input/backend/inputhandler_p.h index 5011481bb..b39aeb681 100644 --- a/src/input/backend/inputhandler_p.h +++ b/src/input/backend/inputhandler_p.h @@ -113,10 +113,14 @@ public: QList<QT_PREPEND_NAMESPACE(QKeyEvent)> pendingKeyEvents(); void clearPendingKeyEvents(); - void appendMouseEvent(const QMouseEvent &event); - QList<QMouseEvent> pendingMouseEvents(); + void appendMouseEvent(const QT_PREPEND_NAMESPACE(QMouseEvent) &event); + QList<QT_PREPEND_NAMESPACE(QMouseEvent)> pendingMouseEvents(); void clearPendingMouseEvents(); + void appendWheelEvent(const QT_PREPEND_NAMESPACE(QWheelEvent) &event); + QList<QT_PREPEND_NAMESPACE(QWheelEvent)> pendingWheelEvents(); + void clearPendingWheelEvents(); + void appendKeyboardDevice(HKeyboardDevice device); void removeKeyboardDevice(HKeyboardDevice device); @@ -148,9 +152,11 @@ private: QVector<HMouseDevice> m_activeMouseDevices; QVector<HGenericDeviceBackendNode> m_activeGenericPhysicalDevices; KeyboardEventFilter *m_keyboardEventFilter; - QList<QT_PREPEND_NAMESPACE(QKeyEvent)> m_pendingEvents; MouseEventFilter *m_mouseEventFilter; - QList<QMouseEvent> m_pendingMouseEvents; + + QList<QT_PREPEND_NAMESPACE(QKeyEvent)> m_pendingKeyEvents; + QList<QT_PREPEND_NAMESPACE(QMouseEvent)> m_pendingMouseEvents; + QList<QT_PREPEND_NAMESPACE(QWheelEvent)> m_pendingWheelEvents; mutable QMutex m_mutex; AxisManager *m_axisManager; diff --git a/src/input/backend/keyboarddevice.cpp b/src/input/backend/keyboarddevice.cpp index 1dace4c15..f48566302 100644 --- a/src/input/backend/keyboarddevice.cpp +++ b/src/input/backend/keyboarddevice.cpp @@ -440,7 +440,7 @@ void KeyboardDevice::setButtonValue(int key, bool value) void KeyboardDevice::updateKeyEvents(const QList<QT_PREPEND_NAMESPACE(QKeyEvent)> &events) { - Q_FOREACH (const QT_PREPEND_NAMESPACE(QKeyEvent) &e, events) + for (const QT_PREPEND_NAMESPACE(QKeyEvent) &e : events) setButtonValue(e.key(), e.type() == QT_PREPEND_NAMESPACE(QKeyEvent)::KeyPress ? true : false); } diff --git a/src/input/backend/keyeventdispatcherjob.cpp b/src/input/backend/keyeventdispatcherjob.cpp index eb8224a4f..d259f2c73 100644 --- a/src/input/backend/keyeventdispatcherjob.cpp +++ b/src/input/backend/keyeventdispatcherjob.cpp @@ -64,7 +64,7 @@ void KeyEventDispatcherJob::run() { KeyboardHandler *input = m_inputHandler->keyboardInputManager()->lookupResource(m_keyboardHandler); if (input) - Q_FOREACH (const QT_PREPEND_NAMESPACE(QKeyEvent) &e, m_events) { + for (const QT_PREPEND_NAMESPACE(QKeyEvent) &e : qAsConst(m_events)) { // Send events to frontend input->keyEvent(QKeyEventPtr(new QKeyEvent(e))); } diff --git a/src/input/backend/mousedevice.cpp b/src/input/backend/mousedevice.cpp index e8ef31e0c..4b37c9854 100644 --- a/src/input/backend/mousedevice.cpp +++ b/src/input/backend/mousedevice.cpp @@ -121,7 +121,7 @@ QVector<Qt3DCore::QNodeId> MouseDevice::mouseInputs() const void MouseDevice::updateMouseEvents(const QList<QT_PREPEND_NAMESPACE(QMouseEvent)> &events) { if (!events.isEmpty()) { - Q_FOREACH (const QT_PREPEND_NAMESPACE(QMouseEvent) &e, events) { + for (const QT_PREPEND_NAMESPACE(QMouseEvent) &e : events) { m_mouseState.leftPressed = e.buttons() & (Qt::LeftButton); m_mouseState.centerPressed = e.buttons() & (Qt::MiddleButton); m_mouseState.rightPressed = e.buttons() & (Qt::RightButton); diff --git a/src/input/backend/mouseeventdispatcherjob.cpp b/src/input/backend/mouseeventdispatcherjob.cpp index c05984121..bfde41310 100644 --- a/src/input/backend/mouseeventdispatcherjob.cpp +++ b/src/input/backend/mouseeventdispatcherjob.cpp @@ -47,11 +47,14 @@ QT_BEGIN_NAMESPACE namespace Qt3DInput { namespace Input { -MouseEventDispatcherJob::MouseEventDispatcherJob(Qt3DCore::QNodeId input, const QList<QT_PREPEND_NAMESPACE(QMouseEvent)> &events) +MouseEventDispatcherJob::MouseEventDispatcherJob(Qt3DCore::QNodeId input, + const QList<QT_PREPEND_NAMESPACE (QMouseEvent)> &mouseEvents, + const QList<QT_PREPEND_NAMESPACE (QWheelEvent)> &wheelEvents) : QAspectJob() , m_inputHandler(Q_NULLPTR) , m_mouseInput(input) - , m_events(events) + , m_mouseEvents(mouseEvents) + , m_wheelEvents(wheelEvents) { } @@ -64,10 +67,11 @@ void MouseEventDispatcherJob::run() { MouseHandler *input = m_inputHandler->mouseInputManager()->lookupResource(m_mouseInput); if (input) { - Q_FOREACH (const QT_PREPEND_NAMESPACE(QMouseEvent) &e, m_events) { - // Send events to frontend + // Send mouse and wheel events to frontend + for (const QT_PREPEND_NAMESPACE(QMouseEvent) &e : m_mouseEvents) input->mouseEvent(QMouseEventPtr(new QMouseEvent(e))); - } + for (const QT_PREPEND_NAMESPACE(QWheelEvent) &e : m_wheelEvents) + input->wheelEvent(QWheelEventPtr(new QWheelEvent(e))); } } diff --git a/src/input/backend/mouseeventdispatcherjob_p.h b/src/input/backend/mouseeventdispatcherjob_p.h index 7db1b1304..defe3c3a3 100644 --- a/src/input/backend/mouseeventdispatcherjob_p.h +++ b/src/input/backend/mouseeventdispatcherjob_p.h @@ -65,14 +65,17 @@ class InputHandler; class MouseEventDispatcherJob : public Qt3DCore::QAspectJob { public: - explicit MouseEventDispatcherJob(Qt3DCore::QNodeId input, const QList<QT_PREPEND_NAMESPACE(QMouseEvent)> &events); + explicit MouseEventDispatcherJob(Qt3DCore::QNodeId input, + const QList<QT_PREPEND_NAMESPACE(QMouseEvent)> &mouseEvents, + const QList<QT_PREPEND_NAMESPACE(QWheelEvent)> &wheelEvents); void setInputHandler(InputHandler *handler); void run() Q_DECL_FINAL; private: InputHandler *m_inputHandler; const Qt3DCore::QNodeId m_mouseInput; - const QList<QT_PREPEND_NAMESPACE(QMouseEvent)> m_events; + const QList<QT_PREPEND_NAMESPACE(QMouseEvent)> m_mouseEvents; + const QList<QT_PREPEND_NAMESPACE(QWheelEvent)> m_wheelEvents; }; } // namespace Input diff --git a/src/input/backend/mouseeventfilter.cpp b/src/input/backend/mouseeventfilter.cpp index be60e47c9..13db38af6 100644 --- a/src/input/backend/mouseeventfilter.cpp +++ b/src/input/backend/mouseeventfilter.cpp @@ -67,9 +67,13 @@ bool MouseEventFilter::eventFilter(QObject *obj, QEvent *e) case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseMove: - // Store event to be processed later on in an InputAspect job + // Creates copy and store event to be processed later on in an InputAspect job m_inputHandler->appendMouseEvent(QMouseEvent(*static_cast<QMouseEvent *>(e))); break; + case QEvent::Wheel: + // Creates copy and store event to be processed later on in an InputAspect job + m_inputHandler->appendWheelEvent(QWheelEvent(*static_cast<QWheelEvent *>(e))); + break; default: break; } |