QCocoaDrag stores the last NSView that received an input event, which becomes a dangling pointer when the NSView gets destroyed. Inform the QCocoaDrag when NSView's destructor runs, so that it can reset the pointer (and reset the NSEvent pointer as well) when the destroyed NSView is the stored one. With this change alone we'd end up triggering the Q_ASSERT later on in QCocoaDrag::drag, as m_lastEvent is now nil so the NSWindow will be nil as well. QCocoaDrag::drag cannot do anything useful if m_lastEvent is nil, so exit early. Pick-to: 6.5 Fixes: QTBUG-116554 Change-Id: I5949d728d05adcf3d4a32c91f7e181393bef0422 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io> (cherry picked from commit 720ce9b97b767fdf36eaf78107b23bd017e191f3) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
72 lines
1.8 KiB
C++
72 lines
1.8 KiB
C++
// Copyright (C) 2016 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
|
|
|
|
#ifndef QCOCOADRAG_H
|
|
#define QCOCOADRAG_H
|
|
|
|
#include <QtGui>
|
|
#include <qpa/qplatformdrag.h>
|
|
#include <private/qsimpledrag_p.h>
|
|
|
|
#include <QtGui/private/qdnd_p.h>
|
|
#include <QtGui/private/qinternalmimedata_p.h>
|
|
|
|
#include <QtCore/qeventloop.h>
|
|
|
|
Q_FORWARD_DECLARE_OBJC_CLASS(NSView);
|
|
Q_FORWARD_DECLARE_OBJC_CLASS(NSEvent);
|
|
Q_FORWARD_DECLARE_OBJC_CLASS(NSPasteboard);
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
|
|
class QCocoaDrag : public QPlatformDrag
|
|
{
|
|
public:
|
|
QCocoaDrag();
|
|
~QCocoaDrag();
|
|
|
|
QMimeData *dragMimeData();
|
|
Qt::DropAction drag(QDrag *m_drag) override;
|
|
|
|
Qt::DropAction defaultAction(Qt::DropActions possibleActions,
|
|
Qt::KeyboardModifiers modifiers) const override;
|
|
|
|
/**
|
|
* to meet NSView dragImage:at guarantees, we need to record the original
|
|
* 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();
|
|
private:
|
|
QDrag *m_drag;
|
|
NSEvent *m_lastEvent;
|
|
NSView *m_lastView;
|
|
Qt::DropAction m_executed_drop_action;
|
|
QEventLoop *m_internalDragLoop = nullptr;
|
|
|
|
bool maybeDragMultipleItems();
|
|
|
|
QPixmap dragPixmap(QDrag *drag, QPoint &hotSpot) const;
|
|
};
|
|
|
|
class QCocoaDropData : public QInternalMimeData
|
|
{
|
|
public:
|
|
QCocoaDropData(NSPasteboard *pasteboard);
|
|
~QCocoaDropData();
|
|
protected:
|
|
bool hasFormat_sys(const QString &mimeType) const;
|
|
QStringList formats_sys() const;
|
|
QVariant retrieveData_sys(const QString &mimeType, QMetaType type) const;
|
|
public:
|
|
CFStringRef dropPasteboard;
|
|
};
|
|
|
|
|
|
QT_END_NAMESPACE
|
|
|
|
#endif
|