86bool QBasicDrag::eventFilter(QObject *o, QEvent *e)
91 if (e->type() == QEvent::KeyRelease &&
static_cast<QKeyEvent*>(e)->key() == Qt::Key_Escape) {
100 case QEvent::ShortcutOverride:
105 case QEvent::KeyPress:
106 case QEvent::KeyRelease:
108 QKeyEvent *ke =
static_cast<QKeyEvent *>(e);
109 if (ke->key() == Qt::Key_Escape && e->type() == QEvent::KeyPress) {
111 disableEventFilter();
114 }
else if (ke->modifiers() != QGuiApplication::keyboardModifiers()) {
115 move(m_lastPos, QGuiApplication::mouseButtons(), ke->modifiers());
120 case QEvent::MouseMove:
122 m_lastPos = getNativeMousePos(e, m_drag_icon_window);
123 auto mouseMove =
static_cast<QMouseEvent *>(e);
124 move(m_lastPos, mouseMove->buttons(), mouseMove->modifiers());
127 case QEvent::MouseButtonRelease:
129 QPointer<QObject> objGuard(o);
130 disableEventFilter();
132 QPoint nativePosition = getNativeMousePos(e, m_drag_icon_window);
133 auto mouseRelease =
static_cast<QMouseEvent *>(e);
134 drop(nativePosition, mouseRelease->buttons(), mouseRelease->modifiers());
147 const QMouseEvent *release =
static_cast<QMouseEvent *>(e);
148 const QWindow *releaseWindow = topLevelAt(release->globalPosition().toPoint());
149 qCDebug(lcDnd) <<
"mouse released over" << releaseWindow <<
"after drag from" << m_sourceWindow <<
"globalPos" << release->globalPosition().toPoint();
151 releaseWindow = m_sourceWindow;
152 QPointF releaseWindowPos = (releaseWindow ? releaseWindow->mapFromGlobal(release->globalPosition()) : release->globalPosition());
153 QMouseEvent *newRelease =
new QMouseEvent(release->type(),
154 releaseWindowPos, releaseWindowPos, release->globalPosition(),
155 release->button(), release->buttons(),
156 release->modifiers(), release->source(), release->pointingDevice());
157 QCoreApplication::postEvent(o, newRelease);
160 case QEvent::MouseButtonDblClick:
226void QBasicDrag::recreateShapedPixmapWindow(QScreen *screen,
const QPoint &pos)
228 delete m_drag_icon_window;
231 m_drag_icon_window =
new QShapedPixmapWindow(screen);
233 m_drag_icon_window->setUseCompositing(m_useCompositing);
234 m_drag_icon_window->setPixmap(m_drag->pixmap());
235 m_drag_icon_window->setHotspot(m_drag->hotSpot());
236 m_drag_icon_window->updateGeometry(pos);
237 m_drag_icon_window->setVisible(
true);
277void QBasicDrag::updateCursor(Qt::DropAction action)
285 Qt::CursorShape cursorShape = Qt::ForbiddenCursor;
289 cursorShape = Qt::DragCopyCursor;
292 cursorShape = Qt::DragLinkCursor;
295 cursorShape = Qt::DragMoveCursor;
300 QPixmap pixmap = m_drag->dragCursor(action);
302 if (!m_dndHasSetOverrideCursor) {
303 QCursor newCursor = !pixmap.isNull() ? QCursor(pixmap) : QCursor(cursorShape);
304 QGuiApplication::setOverrideCursor(newCursor);
305 m_dndHasSetOverrideCursor =
true;
307 QCursor *cursor = QGuiApplication::overrideCursor();
309 QGuiApplication::changeOverrideCursor(pixmap.isNull() ? QCursor(cursorShape) : QCursor(pixmap));
311 if (!pixmap.isNull()) {
312 if (cursor->pixmap().cacheKey() != pixmap.cacheKey())
313 QGuiApplication::changeOverrideCursor(QCursor(pixmap));
314 }
else if (cursorShape != cursor->shape()) {
315 QGuiApplication::changeOverrideCursor(QCursor(cursorShape));
320 updateAction(action);
367void QSimpleDrag::startDrag()
369 setExecutedDropAction(Qt::IgnoreAction);
371 QBasicDrag::startDrag();
377 m_sourceWindow = topLevelAt(QCursor::pos());
378 m_windowUnderCursor = m_sourceWindow;
379 if (m_sourceWindow) {
380 auto nativePixelPos = QHighDpi::toNativePixels(QCursor::pos(), m_sourceWindow);
381 move(nativePixelPos, QGuiApplication::mouseButtons(), QGuiApplication::keyboardModifiers());
384 updateCursor(Qt::IgnoreAction);
387 qCDebug(lcDnd) <<
"drag began from" << m_sourceWindow <<
"cursor pos" << QCursor::pos() <<
"can drop?" << canDrop();
410void QSimpleDrag::move(
const QPoint &nativeGlobalPos, Qt::MouseButtons buttons,
411 Qt::KeyboardModifiers modifiers)
416 QPoint globalPos = fromNativeGlobalPixels(nativeGlobalPos);
417 moveShapedPixmapWindow(globalPos);
418 QWindow *window = topLevelAt(globalPos);
420 if (!window || window != m_windowUnderCursor) {
421 if (m_windowUnderCursor)
422 sendDragLeave(m_windowUnderCursor);
423 m_windowUnderCursor = window;
427 updateCursor(Qt::IgnoreAction);
432 const QPoint pos = nativeGlobalPos - window->handle()->geometry().topLeft();
433 const QPlatformDragQtResponse qt_response = QWindowSystemInterface::handleDrag(
434 window, drag()->mimeData(), pos, drag()->supportedActions(),
437 setCanDrop(qt_response.isAccepted());
438 updateCursor(qt_response.acceptedAction());
441void QSimpleDrag::drop(
const QPoint &nativeGlobalPos, Qt::MouseButtons buttons,
442 Qt::KeyboardModifiers modifiers)
447 QPoint globalPos = fromNativeGlobalPixels(nativeGlobalPos);
449 QBasicDrag::drop(nativeGlobalPos, buttons, modifiers);
450 QWindow *window = topLevelAt(globalPos);
454 const QPoint pos = nativeGlobalPos - window->handle()->geometry().topLeft();
455 const QPlatformDropQtResponse response = QWindowSystemInterface::handleDrop(
456 window, drag()->mimeData(), pos, drag()->supportedActions(),
458 if (response.isAccepted()) {
459 setExecutedDropAction(response.acceptedAction());
461 setExecutedDropAction(Qt::IgnoreAction);