85bool QBasicDrag::eventFilter(QObject *o, QEvent *e)
90 if (e->type() == QEvent::KeyRelease &&
static_cast<QKeyEvent*>(e)->key() == Qt::Key_Escape) {
99 case QEvent::ShortcutOverride:
104 case QEvent::KeyPress:
105 case QEvent::KeyRelease:
107 QKeyEvent *ke =
static_cast<QKeyEvent *>(e);
108 if (ke->key() == Qt::Key_Escape && e->type() == QEvent::KeyPress) {
110 disableEventFilter();
113 }
else if (ke->modifiers() != QGuiApplication::keyboardModifiers()) {
114 move(m_lastPos, QGuiApplication::mouseButtons(), ke->modifiers());
119 case QEvent::MouseMove:
121 m_lastPos = getNativeMousePos(e, m_drag_icon_window);
122 auto mouseMove =
static_cast<QMouseEvent *>(e);
123 move(m_lastPos, mouseMove->buttons(), mouseMove->modifiers());
126 case QEvent::MouseButtonRelease:
128 QPointer<QObject> objGuard(o);
129 disableEventFilter();
131 QPoint nativePosition = getNativeMousePos(e, m_drag_icon_window);
132 auto mouseRelease =
static_cast<QMouseEvent *>(e);
133 drop(nativePosition, mouseRelease->buttons(), mouseRelease->modifiers());
146 const QMouseEvent *release =
static_cast<QMouseEvent *>(e);
147 const QWindow *releaseWindow = topLevelAt(release->globalPosition().toPoint());
148 qCDebug(lcDnd) <<
"mouse released over" << releaseWindow <<
"after drag from" << m_sourceWindow <<
"globalPos" << release->globalPosition().toPoint();
150 releaseWindow = m_sourceWindow;
151 QPointF releaseWindowPos = (releaseWindow ? releaseWindow->mapFromGlobal(release->globalPosition()) : release->globalPosition());
152 QMouseEvent *newRelease =
new QMouseEvent(release->type(),
153 releaseWindowPos, releaseWindowPos, release->globalPosition(),
154 release->button(), release->buttons(),
155 release->modifiers(), release->source(), release->pointingDevice());
156 QCoreApplication::postEvent(o, newRelease);
159 case QEvent::MouseButtonDblClick:
213void QBasicDrag::recreateShapedPixmapWindow(QScreen *screen,
const QPoint &pos)
215 delete m_drag_icon_window;
218 m_drag_icon_window =
new QShapedPixmapWindow(screen);
220 m_drag_icon_window->setUseCompositing(m_useCompositing);
221 m_drag_icon_window->setPixmap(m_drag->pixmap());
222 m_drag_icon_window->setHotspot(m_drag->hotSpot());
223 m_drag_icon_window->updateGeometry(pos);
224 m_drag_icon_window->setVisible(
true);
258void QBasicDrag::updateCursor(Qt::DropAction action)
261 Qt::CursorShape cursorShape = Qt::ForbiddenCursor;
265 cursorShape = Qt::DragCopyCursor;
268 cursorShape = Qt::DragLinkCursor;
271 cursorShape = Qt::DragMoveCursor;
276 QPixmap pixmap = m_drag->dragCursor(action);
278 if (!m_dndHasSetOverrideCursor) {
279 QCursor newCursor = !pixmap.isNull() ? QCursor(pixmap) : QCursor(cursorShape);
280 QGuiApplication::setOverrideCursor(newCursor);
281 m_dndHasSetOverrideCursor =
true;
283 QCursor *cursor = QGuiApplication::overrideCursor();
285 QGuiApplication::changeOverrideCursor(pixmap.isNull() ? QCursor(cursorShape) : QCursor(pixmap));
287 if (!pixmap.isNull()) {
288 if (cursor->pixmap().cacheKey() != pixmap.cacheKey())
289 QGuiApplication::changeOverrideCursor(QCursor(pixmap));
290 }
else if (cursorShape != cursor->shape()) {
291 QGuiApplication::changeOverrideCursor(QCursor(cursorShape));
296 updateAction(action);
343void QSimpleDrag::startDrag()
345 setExecutedDropAction(Qt::IgnoreAction);
347 QBasicDrag::startDrag();
353 m_sourceWindow = topLevelAt(QCursor::pos());
354 m_windowUnderCursor = m_sourceWindow;
355 if (m_sourceWindow) {
356 auto nativePixelPos = QHighDpi::toNativePixels(QCursor::pos(), m_sourceWindow);
357 move(nativePixelPos, QGuiApplication::mouseButtons(), QGuiApplication::keyboardModifiers());
360 updateCursor(Qt::IgnoreAction);
363 qCDebug(lcDnd) <<
"drag began from" << m_sourceWindow <<
"cursor pos" << QCursor::pos() <<
"can drop?" << canDrop();
380void QSimpleDrag::move(
const QPoint &nativeGlobalPos, Qt::MouseButtons buttons,
381 Qt::KeyboardModifiers modifiers)
383 QPoint globalPos = fromNativeGlobalPixels(nativeGlobalPos);
384 moveShapedPixmapWindow(globalPos);
385 QWindow *window = topLevelAt(globalPos);
387 if (!window || window != m_windowUnderCursor) {
388 if (m_windowUnderCursor)
389 sendDragLeave(m_windowUnderCursor);
390 m_windowUnderCursor = window;
394 updateCursor(Qt::IgnoreAction);
399 const QPoint pos = nativeGlobalPos - window->handle()->geometry().topLeft();
400 const QPlatformDragQtResponse qt_response = QWindowSystemInterface::handleDrag(
401 window, drag()->mimeData(), pos, drag()->supportedActions(),
404 setCanDrop(qt_response.isAccepted());
405 updateCursor(qt_response.acceptedAction());
408void QSimpleDrag::drop(
const QPoint &nativeGlobalPos, Qt::MouseButtons buttons,
409 Qt::KeyboardModifiers modifiers)
411 QPoint globalPos = fromNativeGlobalPixels(nativeGlobalPos);
413 QBasicDrag::drop(nativeGlobalPos, buttons, modifiers);
414 QWindow *window = topLevelAt(globalPos);
418 const QPoint pos = nativeGlobalPos - window->handle()->geometry().topLeft();
419 const QPlatformDropQtResponse response = QWindowSystemInterface::handleDrop(
420 window, drag()->mimeData(), pos, drag()->supportedActions(),
422 if (response.isAccepted()) {
423 setExecutedDropAction(response.acceptedAction());
425 setExecutedDropAction(Qt::IgnoreAction);