diff --git a/src/plugins/platforms/cocoa/qcocoadrag.h b/src/plugins/platforms/cocoa/qcocoadrag.h index f470fa39a9f..30456a91bba 100644 --- a/src/plugins/platforms/cocoa/qcocoadrag.h +++ b/src/plugins/platforms/cocoa/qcocoadrag.h @@ -36,6 +36,7 @@ public: * event and view when handling an event in QNSView */ void setLastInputEvent(NSEvent *event, NSView *view); + void viewDestroyed(NSView *view); void setAcceptedAction(Qt::DropAction act); void exitDragLoop(); diff --git a/src/plugins/platforms/cocoa/qcocoadrag.mm b/src/plugins/platforms/cocoa/qcocoadrag.mm index 3b736db39b3..bbc75bf6dbe 100644 --- a/src/plugins/platforms/cocoa/qcocoadrag.mm +++ b/src/plugins/platforms/cocoa/qcocoadrag.mm @@ -38,6 +38,17 @@ void QCocoaDrag::setLastInputEvent(NSEvent *event, NSView *view) m_lastView = view; } +void QCocoaDrag::viewDestroyed(NSView *view) +{ + if (view == m_lastView) { + if (m_lastEvent.window.contentView == view) { + [m_lastEvent release]; + m_lastEvent = nil; + } + m_lastView = nil; + } +} + QMimeData *QCocoaDrag::dragMimeData() { if (m_drag) @@ -95,9 +106,11 @@ Qt::DropAction QCocoaDrag::defaultAction(Qt::DropActions possibleActions, Qt::DropAction QCocoaDrag::drag(QDrag *o) { - m_drag = o; m_executed_drop_action = Qt::IgnoreAction; + if (!m_lastEvent) + return m_executed_drop_action; + m_drag = o; QMacPasteboard dragBoard(CFStringRef(NSPasteboardNameDrag), QUtiMimeConverter::HandlerScopeFlag::DnD); m_drag->mimeData()->setData("application/x-qt-mime-type-name"_L1, QByteArray("dummy")); dragBoard.setMimeData(m_drag->mimeData(), QMacPasteboard::LazyRequest); diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index 560cada5fb4..e961021d240 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -173,6 +173,10 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSViewMenuHelper); [[NSNotificationCenter defaultCenter] removeObserver:self]; [m_mouseMoveHelper release]; + // FIXME: Replace with __weak or someting equivalent + QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); + nativeDrag->viewDestroyed(self); + [super dealloc]; }