From e91d2339379ef1f6798b28f1247e20478cf7cf18 Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Thu, 21 Apr 2016 15:26:21 +0200 Subject: Add Mouse Wheel event handling in the backend Change-Id: If567e20140b80f12611a815703b75f3b7c5115fb Task-number: QTBUG-52243 Reviewed-by: Sean Harmer --- src/input/backend/inputhandler.cpp | 45 +++++++++++++++++++-------- src/input/backend/inputhandler_p.h | 14 ++++++--- src/input/backend/keyboarddevice.cpp | 2 +- src/input/backend/keyeventdispatcherjob.cpp | 2 +- src/input/backend/mousedevice.cpp | 2 +- src/input/backend/mouseeventdispatcherjob.cpp | 14 ++++++--- src/input/backend/mouseeventdispatcherjob_p.h | 7 +++-- 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 InputHandler::pendingKeyEvents() { QMutexLocker lock(&m_mutex); - QList 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 InputHandler::pendingMouseEvents() { QMutexLocker lock(&m_mutex); - QList 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 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 InputHandler::keyboardJobs() QVector InputHandler::mouseJobs() { QVector jobs; - const QList events = pendingMouseEvents(); + const QList mouseEvents = pendingMouseEvents(); + const QList 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 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 pendingKeyEvents(); void clearPendingKeyEvents(); - void appendMouseEvent(const QMouseEvent &event); - QList pendingMouseEvents(); + void appendMouseEvent(const QT_PREPEND_NAMESPACE(QMouseEvent) &event); + QList pendingMouseEvents(); void clearPendingMouseEvents(); + void appendWheelEvent(const QT_PREPEND_NAMESPACE(QWheelEvent) &event); + QList pendingWheelEvents(); + void clearPendingWheelEvents(); + void appendKeyboardDevice(HKeyboardDevice device); void removeKeyboardDevice(HKeyboardDevice device); @@ -148,9 +152,11 @@ private: QVector m_activeMouseDevices; QVector m_activeGenericPhysicalDevices; KeyboardEventFilter *m_keyboardEventFilter; - QList m_pendingEvents; MouseEventFilter *m_mouseEventFilter; - QList m_pendingMouseEvents; + + QList m_pendingKeyEvents; + QList m_pendingMouseEvents; + QList 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 &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 MouseDevice::mouseInputs() const void MouseDevice::updateMouseEvents(const QList &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 &events) +MouseEventDispatcherJob::MouseEventDispatcherJob(Qt3DCore::QNodeId input, + const QList &mouseEvents, + const QList &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 &events); + explicit MouseEventDispatcherJob(Qt3DCore::QNodeId input, + const QList &mouseEvents, + const QList &wheelEvents); void setInputHandler(InputHandler *handler); void run() Q_DECL_FINAL; private: InputHandler *m_inputHandler; const Qt3DCore::QNodeId m_mouseInput; - const QList m_events; + const QList m_mouseEvents; + const QList 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(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(e))); + break; default: break; } -- cgit v1.2.3