summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-04-21 15:26:21 +0200
committerSean Harmer <sean.harmer@kdab.com>2016-04-21 17:28:01 +0000
commite91d2339379ef1f6798b28f1247e20478cf7cf18 (patch)
treead9242b23b90b0270bd7cc780c7dc27e0ea742c9
parentc8b021896accbf8fea4779a3812bbddae09e881f (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.cpp45
-rw-r--r--src/input/backend/inputhandler_p.h14
-rw-r--r--src/input/backend/keyboarddevice.cpp2
-rw-r--r--src/input/backend/keyeventdispatcherjob.cpp2
-rw-r--r--src/input/backend/mousedevice.cpp2
-rw-r--r--src/input/backend/mouseeventdispatcherjob.cpp14
-rw-r--r--src/input/backend/mouseeventdispatcherjob_p.h7
-rw-r--r--src/input/backend/mouseeventfilter.cpp6
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;
}