summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMike Krus <mike.krus@kdab.com>2020-11-23 11:20:41 +0000
committerMike Krus <mike.krus@kdab.com>2020-11-24 18:50:12 +0000
commitc9ddee20bc6f82b171cc9346d7afa3562b7e41ca (patch)
treeffeb27b52418050cbc2df0d780c7828ff99923ff /src
parent9c2f818c270f0edad5d9d6ea7c027e033ab39a64 (diff)
Handle fallout from QEvent loosing it's copy constructor
Task-number: QTBUG-88757 Change-Id: I5097faecd2e895d4685a4cc57a4e2a5c079f2255 Reviewed-by: Paul Lemire <paul.lemire@kdab.com> (cherry picked from commit d826238b65b0ebd8034900224b382bd85e6add27) Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/animation/frontend/qanimationclipdata.h1
-rw-r--r--src/input/frontend/qkeyevent.cpp8
-rw-r--r--src/input/frontend/qkeyevent.h22
-rw-r--r--src/input/frontend/qmouseevent.cpp26
-rw-r--r--src/input/frontend/qmouseevent.h33
-rw-r--r--src/plugins/renderers/opengl/renderer/renderer.cpp6
-rw-r--r--src/plugins/renderers/opengl/renderer/renderer_p.h2
-rw-r--r--src/render/jobs/pickboundingvolumejob.cpp10
-rw-r--r--src/render/jobs/pickboundingvolumejob_p.h3
-rw-r--r--src/render/picking/pickeventfilter.cpp22
-rw-r--r--src/render/picking/pickeventfilter_p.h5
11 files changed, 59 insertions, 79 deletions
diff --git a/src/animation/frontend/qanimationclipdata.h b/src/animation/frontend/qanimationclipdata.h
index 07c7d92c2..bcb0fcda1 100644
--- a/src/animation/frontend/qanimationclipdata.h
+++ b/src/animation/frontend/qanimationclipdata.h
@@ -40,6 +40,7 @@
#ifndef QT3DANIMATION_QANIMATIONCLIPDATA_H
#define QT3DANIMATION_QANIMATIONCLIPDATA_H
+#include <QtCore/qmetatype.h>
#include <QtCore/qscopedpointer.h>
#include <QtCore/qstring.h>
#include <Qt3DAnimation/qt3danimation_global.h>
diff --git a/src/input/frontend/qkeyevent.cpp b/src/input/frontend/qkeyevent.cpp
index efbddc771..07319ea53 100644
--- a/src/input/frontend/qkeyevent.cpp
+++ b/src/input/frontend/qkeyevent.cpp
@@ -74,16 +74,16 @@ namespace Qt3DInput {
QKeyEvent::QKeyEvent(QEvent::Type type, int key, Qt::KeyboardModifiers modifiers, const QString &text, bool autorep, ushort count)
: QObject()
- , m_event(type, key, modifiers, text, autorep, count)
+ , m_event(new QT_PREPEND_NAMESPACE(QKeyEvent){type, key, modifiers, text, autorep, count})
{
- m_event.setAccepted(false);
+ m_event->setAccepted(false);
}
QKeyEvent::QKeyEvent(const QT_PREPEND_NAMESPACE(QKeyEvent) &ke)
: QObject()
- , m_event(ke)
+ , m_event(static_cast<QT_PREPEND_NAMESPACE(QKeyEvent) *>(ke.clone()))
{
- m_event.setAccepted(false);
+ m_event->setAccepted(false);
}
/*! \internal */
diff --git a/src/input/frontend/qkeyevent.h b/src/input/frontend/qkeyevent.h
index c1e221aae..52be3b213 100644
--- a/src/input/frontend/qkeyevent.h
+++ b/src/input/frontend/qkeyevent.h
@@ -69,21 +69,21 @@ public:
explicit QKeyEvent(const QT_PREPEND_NAMESPACE(QKeyEvent) &ke);
~QKeyEvent();
- inline int key() const { return m_event.key(); }
- inline QString text() const { return m_event.text(); }
- inline int modifiers() const { return m_event.modifiers(); }
- inline bool isAutoRepeat() const { return m_event.isAutoRepeat(); }
- inline int count() const { return m_event.count(); }
- inline quint32 nativeScanCode() const { return m_event.nativeScanCode(); }
- inline bool isAccepted() const { return m_event.isAccepted(); }
- inline void setAccepted(bool accepted) { m_event.setAccepted(accepted); }
- inline QEvent::Type type() const { return m_event.type(); }
+ inline int key() const { return m_event->key(); }
+ inline QString text() const { return m_event->text(); }
+ inline int modifiers() const { return m_event->modifiers(); }
+ inline bool isAutoRepeat() const { return m_event->isAutoRepeat(); }
+ inline int count() const { return m_event->count(); }
+ inline quint32 nativeScanCode() const { return m_event->nativeScanCode(); }
+ inline bool isAccepted() const { return m_event->isAccepted(); }
+ inline void setAccepted(bool accepted) { m_event->setAccepted(accepted); }
+ inline QEvent::Type type() const { return m_event->type(); }
#if QT_CONFIG(shortcut)
- Q_INVOKABLE bool matches(QKeySequence::StandardKey key_) const { return m_event.matches(key_); }
+ Q_INVOKABLE bool matches(QKeySequence::StandardKey key_) const { return m_event->matches(key_); }
#endif
private:
- QT_PREPEND_NAMESPACE(QKeyEvent) m_event;
+ std::unique_ptr<QT_PREPEND_NAMESPACE(QKeyEvent)> m_event;
};
} // namespace Qt3DInput
diff --git a/src/input/frontend/qmouseevent.cpp b/src/input/frontend/qmouseevent.cpp
index 2b06c824d..d73724360 100644
--- a/src/input/frontend/qmouseevent.cpp
+++ b/src/input/frontend/qmouseevent.cpp
@@ -46,9 +46,9 @@ namespace Qt3DInput {
namespace {
template<typename EventClass, typename QtEventClass>
-typename EventClass::Modifiers modifiersForEvent(const QtEventClass &event)
+typename EventClass::Modifiers modifiersForEvent(const QtEventClass *event)
{
- const Qt::KeyboardModifiers eventModifiers = event.modifiers();
+ const Qt::KeyboardModifiers eventModifiers = event->modifiers();
int modifiers = EventClass::NoModifier;
if (eventModifiers & Qt::ShiftModifier)
@@ -259,7 +259,11 @@ typename EventClass::Modifiers modifiersForEvent(const QtEventClass &event)
*/
QMouseEvent::QMouseEvent(const QT_PREPEND_NAMESPACE(QMouseEvent) &e)
: QObject()
- , m_event(e)
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ , m_event(static_cast<QT_PREPEND_NAMESPACE(QMouseEvent)*>(e.clone()))
+#else
+ , m_even(new QT_PREPEND_NAMESPACE(QMouseEvent)(e))
+#endif
{
}
@@ -272,7 +276,7 @@ QMouseEvent::~QMouseEvent()
*/
QMouseEvent::Buttons QMouseEvent::button() const
{
- switch (m_event.button()) {
+ switch (m_event->button()) {
case Qt::LeftButton:
return QMouseEvent::LeftButton;
case Qt::RightButton:
@@ -292,7 +296,7 @@ QMouseEvent::Buttons QMouseEvent::button() const
*/
int QMouseEvent::buttons() const
{
- return m_event.buttons();
+ return m_event->buttons();
}
/*!
@@ -300,7 +304,7 @@ int QMouseEvent::buttons() const
*/
QMouseEvent::Modifiers QMouseEvent::modifiers() const
{
- return modifiersForEvent<QMouseEvent, decltype(m_event)>(m_event);
+ return modifiersForEvent<QMouseEvent, QT_PREPEND_NAMESPACE(QMouseEvent)>(m_event.get());
}
/*!
@@ -478,7 +482,11 @@ QMouseEvent::Modifiers QMouseEvent::modifiers() const
*/
QWheelEvent::QWheelEvent(const QT_PREPEND_NAMESPACE(QWheelEvent) &e)
: QObject()
- , m_event(e)
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ , m_event(static_cast<QT_PREPEND_NAMESPACE(QWheelEvent)*>(e.clone()))
+#else
+ , m_even(new QT_PREPEND_NAMESPACE(QMouseEvent)(e))
+#endif
{
}
@@ -492,7 +500,7 @@ QWheelEvent::~QWheelEvent()
*/
int QWheelEvent::buttons() const
{
- return m_event.buttons();
+ return m_event->buttons();
}
/*!
@@ -500,7 +508,7 @@ int QWheelEvent::buttons() const
*/
QWheelEvent::Modifiers QWheelEvent::modifiers() const
{
- return modifiersForEvent<QWheelEvent, decltype(m_event)>(m_event);
+ return modifiersForEvent<QWheelEvent, QT_PREPEND_NAMESPACE(QWheelEvent)>(m_event.get());
}
#endif // QT_CONFIG(wheelevent)
diff --git a/src/input/frontend/qmouseevent.h b/src/input/frontend/qmouseevent.h
index a663c2e44..809c71ec5 100644
--- a/src/input/frontend/qmouseevent.h
+++ b/src/input/frontend/qmouseevent.h
@@ -45,6 +45,8 @@
#include <QtCore/QObject>
#include <QtGui/QMouseEvent>
+#include <memory>
+
QT_BEGIN_NAMESPACE
namespace Qt3DInput {
@@ -59,7 +61,6 @@ class Q_3DINPUTSHARED_EXPORT QMouseEvent : public QObject
Q_PROPERTY(int buttons READ buttons CONSTANT)
Q_PROPERTY(Qt3DInput::QMouseEvent::Modifiers modifiers READ modifiers CONSTANT)
Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
-
public:
enum Buttons {
LeftButton = Qt::LeftButton,
@@ -84,25 +85,25 @@ public:
explicit QMouseEvent(const QT_PREPEND_NAMESPACE(QMouseEvent) &e);
~QMouseEvent();
- inline int x() const { return int(m_event.position().x()); }
- inline int y() const { return int(m_event.position().y()); }
+ inline int x() const { return int(m_event->position().x()); }
+ inline int y() const { return int(m_event->position().y()); }
inline bool wasHeld() const {
#if QT_CONFIG(gestures)
- return static_cast<Qt::GestureType>(m_event.type()) == Qt::TapAndHoldGesture;
+ return static_cast<Qt::GestureType>(m_event->type()) == Qt::TapAndHoldGesture;
#else
- return false;
+ return false;
#endif
}
Buttons button() const;
int buttons() const;
Modifiers modifiers() const;
- inline bool isAccepted() const { return m_event.isAccepted(); }
- inline void setAccepted(bool accepted) { m_event.setAccepted(accepted); }
- inline QEvent::Type type() const { return m_event.type(); }
+ inline bool isAccepted() const { return m_event->isAccepted(); }
+ inline void setAccepted(bool accepted) { m_event->setAccepted(accepted); }
+ inline QEvent::Type type() const { return m_event->type(); }
private:
- QT_PREPEND_NAMESPACE(QMouseEvent) m_event;
+ std::unique_ptr<QT_PREPEND_NAMESPACE(QMouseEvent)> m_event;
};
typedef QSharedPointer<QMouseEvent> QMouseEventPtr;
@@ -142,18 +143,18 @@ public:
explicit QWheelEvent(const QT_PREPEND_NAMESPACE(QWheelEvent) &e);
~QWheelEvent();
- inline int x() const { return int(m_event.position().x()); }
- inline int y() const { return int(m_event.position().y()); }
- inline QPoint angleDelta() const { return m_event.angleDelta(); }
+ inline int x() const { return int(m_event->position().x()); }
+ inline int y() const { return int(m_event->position().y()); }
+ inline QPoint angleDelta() const { return m_event->angleDelta(); }
int buttons() const;
Modifiers modifiers() const;
- inline bool isAccepted() const { return m_event.isAccepted(); }
- inline void setAccepted(bool accepted) { m_event.setAccepted(accepted); }
- inline QEvent::Type type() const { return m_event.type(); }
+ inline bool isAccepted() const { return m_event->isAccepted(); }
+ inline void setAccepted(bool accepted) { m_event->setAccepted(accepted); }
+ inline QEvent::Type type() const { return m_event->type(); }
private:
- QT_PREPEND_NAMESPACE(QWheelEvent) m_event;
+ std::unique_ptr<QT_PREPEND_NAMESPACE(QWheelEvent)> m_event;
};
typedef QSharedPointer<QWheelEvent> QWheelEventPtr;
diff --git a/src/plugins/renderers/opengl/renderer/renderer.cpp b/src/plugins/renderers/opengl/renderer/renderer.cpp
index 26b2b0ed8..91bf77fa9 100644
--- a/src/plugins/renderers/opengl/renderer/renderer.cpp
+++ b/src/plugins/renderers/opengl/renderer/renderer.cpp
@@ -1639,12 +1639,6 @@ Renderer::ViewSubmissionResultData Renderer::submitRenderViews(const std::vector
m_imGuiRenderer->setCapabilities(m_settings->capabilities());
}
- {
- for (auto &keyEvent: m_frameKeyEvents)
- m_imGuiRenderer->processEvent(&keyEvent);
- for (auto &mouseEvent: m_frameMouseEvents)
- m_imGuiRenderer->processEvent(&mouseEvent.second);
- }
m_imGuiRenderer->renderDebugOverlay(renderViews, renderView, m_jobsInLastFrame);
}
#endif
diff --git a/src/plugins/renderers/opengl/renderer/renderer_p.h b/src/plugins/renderers/opengl/renderer/renderer_p.h
index 4e4b7a28a..aedd49b49 100644
--- a/src/plugins/renderers/opengl/renderer/renderer_p.h
+++ b/src/plugins/renderers/opengl/renderer/renderer_p.h
@@ -419,8 +419,6 @@ private:
QSharedPointer<ResourceAccessor> m_scene2DResourceAccessor;
Debug::ImGuiRenderer *m_imGuiRenderer;
- QList<QPair<QObject *, QMouseEvent>> m_frameMouseEvents;
- QList<QKeyEvent> m_frameKeyEvents;
int m_jobsInLastFrame;
};
diff --git a/src/render/jobs/pickboundingvolumejob.cpp b/src/render/jobs/pickboundingvolumejob.cpp
index e0f4c8bf0..2420ce439 100644
--- a/src/render/jobs/pickboundingvolumejob.cpp
+++ b/src/render/jobs/pickboundingvolumejob.cpp
@@ -211,7 +211,11 @@ void PickBoundingVolumeJob::setRoot(Entity *root)
bool PickBoundingVolumeJob::processMouseEvent(QObject* object, QMouseEvent *event)
{
- m_pendingMouseEvents.emplace_back(object, QMouseEvent(*event));
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ m_pendingMouseEvents.emplace_back(object, std::unique_ptr<QMouseEvent>(static_cast<QMouseEvent *>(event->clone())));
+#else
+ m_pendingMouseEvents.emplace_back(object, new QMouseEvent(*event));
+#endif
return false;
}
@@ -254,7 +258,7 @@ bool PickBoundingVolumeJob::runHelper()
bool hasOtherEvent = false;
// Quickly look which types of events we've got
for (const auto &event : mouseEvents) {
- const bool isMove = (event.second.type() == QEvent::MouseMove);
+ const bool isMove = (event.second->type() == QEvent::MouseMove);
hasMoveEvent |= isMove;
hasOtherEvent |= !isMove;
}
@@ -290,7 +294,7 @@ bool PickBoundingVolumeJob::runHelper()
// For each mouse event
for (const auto &event : mouseEvents)
- processPickEvent(pickConfiguration, event.first, &event.second);
+ processPickEvent(pickConfiguration, event.first, event.second.get());
// Clear Hovered elements that needs to be cleared
// Send exit event to object pickers on which we
diff --git a/src/render/jobs/pickboundingvolumejob_p.h b/src/render/jobs/pickboundingvolumejob_p.h
index daf66583f..f95d4f773 100644
--- a/src/render/jobs/pickboundingvolumejob_p.h
+++ b/src/render/jobs/pickboundingvolumejob_p.h
@@ -65,6 +65,7 @@
#include <QSharedPointer>
#include <vector>
+#include <memory>
QT_BEGIN_NAMESPACE
@@ -109,7 +110,7 @@ private:
void clearPreviouslyHoveredPickers();
- std::vector<std::pair<QObject*, QMouseEvent>> m_pendingMouseEvents;
+ std::vector<std::pair<QObject*, std::unique_ptr<QMouseEvent>>> m_pendingMouseEvents;
bool m_pickersDirty;
bool m_oneHoverAtLeast;
HObjectPicker m_currentPicker;
diff --git a/src/render/picking/pickeventfilter.cpp b/src/render/picking/pickeventfilter.cpp
index 42e26dbae..998829b34 100644
--- a/src/render/picking/pickeventfilter.cpp
+++ b/src/render/picking/pickeventfilter.cpp
@@ -60,25 +60,6 @@ PickEventFilter::~PickEventFilter()
/*!
\internal
- Called from a worker thread in the thread pool so be sure to
- mutex protect the data.
-*/
-QList<QPair<QObject *, QMouseEvent> > PickEventFilter::pendingMouseEvents()
-{
- QList<QPair<QObject*, QMouseEvent>> pendingEvents(m_pendingMouseEvents);
- m_pendingMouseEvents.clear();
- return pendingEvents;
-}
-
-QList<QKeyEvent> PickEventFilter::pendingKeyEvents()
-{
- QList<QKeyEvent> pendingEvents(m_pendingKeyEvents);
- m_pendingKeyEvents.clear();
- return pendingEvents;
-}
-
-/*!
- \internal
Called from the main thread.
*/
bool PickEventFilter::eventFilter(QObject *obj, QEvent *e)
@@ -87,19 +68,16 @@ bool PickEventFilter::eventFilter(QObject *obj, QEvent *e)
case QEvent::MouseButtonPress:
case QEvent::MouseButtonRelease:
case QEvent::MouseMove:
- m_pendingMouseEvents.push_back({obj, QMouseEvent(*static_cast<QMouseEvent *>(e))});
return m_aspect->processMouseEvent(obj, static_cast<QMouseEvent *>(e));
case QEvent::HoverMove: {
QHoverEvent *he = static_cast<QHoverEvent *>(e);
auto mouseEvent = QMouseEvent(QEvent::MouseMove,
he->position(), Qt::NoButton, Qt::NoButton,
he->modifiers());
- m_pendingMouseEvents.push_back({obj, mouseEvent});
return m_aspect->processMouseEvent(obj, &mouseEvent);
}
case QEvent::KeyPress:
case QEvent::KeyRelease:
- m_pendingKeyEvents.push_back(QKeyEvent(*static_cast<QKeyEvent *>(e)));
return m_aspect->processKeyEvent(obj, static_cast<QKeyEvent *>(e));
default:
break;
diff --git a/src/render/picking/pickeventfilter_p.h b/src/render/picking/pickeventfilter_p.h
index 85fcf454a..67752458b 100644
--- a/src/render/picking/pickeventfilter_p.h
+++ b/src/render/picking/pickeventfilter_p.h
@@ -72,16 +72,11 @@ public:
explicit PickEventFilter(QRenderAspectPrivate *aspect, QObject *parent = nullptr);
~PickEventFilter();
- QList<QPair<QObject*, QMouseEvent>> pendingMouseEvents();
- QList<QKeyEvent> pendingKeyEvents();
-
protected:
bool eventFilter(QObject *obj, QEvent *e) final;
private:
QRenderAspectPrivate *m_aspect;
- QList<QPair<QObject*, QMouseEvent>> m_pendingMouseEvents;
- QList<QKeyEvent> m_pendingKeyEvents;
};
} // Render