From ef0dce610035b9ee68f9c58fbba300a5e1c36277 Mon Sep 17 00:00:00 2001 From: Michael Winkelmann Date: Mon, 19 Oct 2020 14:41:54 +0200 Subject: [PATCH] QBasicDrag: Only create QShapedPixmapWindow when drag pixmap is not null This is a temporary workaround for drag and drop crashing on EGLFS because it is attempted to create a raster window which is not possible. Change-Id: I452147aeaf20304184d68e91b9db67603086ae49 --- src/gui/kernel/qsimpledrag.cpp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/gui/kernel/qsimpledrag.cpp b/src/gui/kernel/qsimpledrag.cpp index bd409c124f..719c2291d8 100644 --- a/src/gui/kernel/qsimpledrag.cpp +++ b/src/gui/kernel/qsimpledrag.cpp @@ -152,7 +152,7 @@ bool QBasicDrag::eventFilter(QObject *o, QEvent *e) case QEvent::MouseMove: { - QPoint nativePosition = getNativeMousePos(e, m_drag_icon_window); + QPoint nativePosition = getNativeMousePos(e, m_drag_icon_window ? m_drag_icon_window : m_sourceWindow); auto mouseMove = static_cast(e); move(nativePosition, mouseMove->buttons(), mouseMove->modifiers()); return true; // Eat all mouse move events @@ -161,7 +161,7 @@ bool QBasicDrag::eventFilter(QObject *o, QEvent *e) { disableEventFilter(); if (canDrop()) { - QPoint nativePosition = getNativeMousePos(e, m_drag_icon_window); + QPoint nativePosition = getNativeMousePos(e, m_drag_icon_window ? m_drag_icon_window : m_sourceWindow); auto mouseRelease = static_cast(e); drop(nativePosition, mouseRelease->buttons(), mouseRelease->modifiers()); } else { @@ -242,22 +242,23 @@ void QBasicDrag::endDrag() void QBasicDrag::recreateShapedPixmapWindow(QScreen *screen, const QPoint &pos) { delete m_drag_icon_window; - // ### TODO Check if its really necessary to have m_drag_icon_window - // when QDrag is used without a pixmap - QDrag::setPixmap() - m_drag_icon_window = new QShapedPixmapWindow(screen); - - m_drag_icon_window->setUseCompositing(m_useCompositing); - m_drag_icon_window->setPixmap(m_drag->pixmap()); - m_drag_icon_window->setHotspot(m_drag->hotSpot()); - m_drag_icon_window->updateGeometry(pos); - m_drag_icon_window->setVisible(true); + + if (m_drag && !m_drag->pixmap().isNull()) { + m_drag_icon_window = new QShapedPixmapWindow(screen); + m_drag_icon_window->setUseCompositing(m_useCompositing); + m_drag_icon_window->setPixmap(m_drag->pixmap()); + m_drag_icon_window->setHotspot(m_drag->hotSpot()); + m_drag_icon_window->updateGeometry(pos); + m_drag_icon_window->setVisible(true); + } } void QBasicDrag::cancel() { disableEventFilter(); restoreCursor(); - m_drag_icon_window->setVisible(false); + if (m_drag_icon_window) + m_drag_icon_window->setVisible(false); } /*! @@ -267,7 +268,7 @@ void QBasicDrag::cancel() void QBasicDrag::moveShapedPixmapWindow(const QPoint &globalPos) { - if (m_drag) + if (m_drag && m_drag_icon_window) m_drag_icon_window->updateGeometry(globalPos); } @@ -275,7 +276,8 @@ void QBasicDrag::drop(const QPoint &, Qt::MouseButtons, Qt::KeyboardModifiers) { disableEventFilter(); restoreCursor(); - m_drag_icon_window->setVisible(false); + if (m_drag_icon_window) + m_drag_icon_window->setVisible(false); } void QBasicDrag::exitDndEventLoop() -- 2.25.1