diff --git a/src/private/DragController.cpp b/src/private/DragController.cpp index 9aba2620..7734b614 100644 --- a/src/private/DragController.cpp +++ b/src/private/DragController.cpp @@ -161,6 +161,7 @@ void StateNone::onEntry() q->m_pressPos = QPoint(); q->m_offset = QPoint(); q->m_draggable = nullptr; + q->m_draggableGuard.clear(); q->m_windowBeingDragged.reset(); WidgetResizeHandler::s_disableAllHandlers = false; // Re-enable resize handlers @@ -174,12 +175,13 @@ void StateNone::onEntry() bool StateNone::handleMouseButtonPress(Draggable *draggable, QPoint globalPos, QPoint pos) { qCDebug(state) << "StateNone::handleMouseButtonPress: draggable" - << draggable << "; globalPos" << globalPos; + << draggable->asWidget() << "; globalPos" << globalPos; if (!draggable->isPositionDraggable(pos)) return false; q->m_draggable = draggable; + q->m_draggableGuard = draggable->asWidget(); q->m_pressPos = globalPos; q->m_offset = pos; Q_EMIT q->mousePressed(); @@ -198,7 +200,7 @@ StatePreDrag::~StatePreDrag() = default; void StatePreDrag::onEntry() { - qCDebug(state) << "StatePreDrag entered"; + qCDebug(state) << "StatePreDrag entered" << q->m_draggableGuard.data(); WidgetResizeHandler::s_disableAllHandlers = true; // Disable the resize handler during dragging } @@ -264,7 +266,8 @@ void StateDragging::onEntry() # endif #endif - qCDebug(state) << "StateDragging entered. m_draggable=" << q->m_draggable << "; m_windowBeingDragged=" << q->m_windowBeingDragged->floatingWindow(); + qCDebug(state) << "StateDragging entered. m_draggable=" << q->m_draggable->asWidget() + << "; m_windowBeingDragged=" << q->m_windowBeingDragged->floatingWindow(); auto fw = q->m_windowBeingDragged->floatingWindow(); if (!fw->geometry().contains(q->m_pressPos)) { diff --git a/src/private/DragController_p.h b/src/private/DragController_p.h index 27608c9c..1e596ab1 100644 --- a/src/private/DragController_p.h +++ b/src/private/DragController_p.h @@ -118,6 +118,7 @@ private: Draggable::List m_draggables; Draggable *m_draggable = nullptr; + QPointer m_draggableGuard; // Just so we know if the draggable was destroyed for some reason std::unique_ptr m_windowBeingDragged; DropArea *m_currentDropArea = nullptr; bool m_nonClientDrag = false;