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:
214void QBasicDrag::recreateShapedPixmapWindow(QScreen *screen,
const QPoint &pos)
216 delete m_drag_icon_window;
219 m_drag_icon_window =
new QShapedPixmapWindow(screen);
221 m_drag_icon_window->setUseCompositing(m_useCompositing);
222 m_drag_icon_window->setPixmap(m_drag->pixmap());
223 m_drag_icon_window->setHotspot(m_drag->hotSpot());
224 m_drag_icon_window->updateGeometry(pos);
225 m_drag_icon_window->setVisible(
true);
259void QBasicDrag::updateCursor(Qt::DropAction action)
262 Qt::CursorShape cursorShape = Qt::ForbiddenCursor;
266 cursorShape = Qt::DragCopyCursor;
269 cursorShape = Qt::DragLinkCursor;
272 cursorShape = Qt::DragMoveCursor;
277 QPixmap pixmap = m_drag->dragCursor(action);
279 if (!m_dndHasSetOverrideCursor) {
280 QCursor newCursor = !pixmap.isNull() ? QCursor(pixmap) : QCursor(cursorShape);
281 QGuiApplication::setOverrideCursor(newCursor);
282 m_dndHasSetOverrideCursor =
true;
284 QCursor *cursor = QGuiApplication::overrideCursor();
286 QGuiApplication::changeOverrideCursor(pixmap.isNull() ? QCursor(cursorShape) : QCursor(pixmap));
288 if (!pixmap.isNull()) {
289 if (cursor->pixmap().cacheKey() != pixmap.cacheKey())
290 QGuiApplication::changeOverrideCursor(QCursor(pixmap));
291 }
else if (cursorShape != cursor->shape()) {
292 QGuiApplication::changeOverrideCursor(QCursor(cursorShape));
297 updateAction(action);
344void QSimpleDrag::startDrag()
346 setExecutedDropAction(Qt::IgnoreAction);
348 QBasicDrag::startDrag();
354 m_sourceWindow = topLevelAt(QCursor::pos());
355 m_windowUnderCursor = m_sourceWindow;
356 if (m_sourceWindow) {
357 auto nativePixelPos = QHighDpi::toNativePixels(QCursor::pos(), m_sourceWindow);
358 move(nativePixelPos, QGuiApplication::mouseButtons(), QGuiApplication::keyboardModifiers());
361 updateCursor(Qt::IgnoreAction);
364 qCDebug(lcDnd) <<
"drag began from" << m_sourceWindow <<
"cursor pos" << QCursor::pos() <<
"can drop?" << canDrop();
381void QSimpleDrag::move(
const QPoint &nativeGlobalPos, Qt::MouseButtons buttons,
382 Qt::KeyboardModifiers modifiers)
384 QPoint globalPos = fromNativeGlobalPixels(nativeGlobalPos);
385 moveShapedPixmapWindow(globalPos);
386 QWindow *window = topLevelAt(globalPos);
388 if (!window || window != m_windowUnderCursor) {
389 if (m_windowUnderCursor)
390 sendDragLeave(m_windowUnderCursor);
391 m_windowUnderCursor = window;
395 updateCursor(Qt::IgnoreAction);
400 const QPoint pos = nativeGlobalPos - window->handle()->geometry().topLeft();
401 const QPlatformDragQtResponse qt_response = QWindowSystemInterface::handleDrag(
402 window, drag()->mimeData(), pos, drag()->supportedActions(),
405 setCanDrop(qt_response.isAccepted());
406 updateCursor(qt_response.acceptedAction());
409void QSimpleDrag::drop(
const QPoint &nativeGlobalPos, Qt::MouseButtons buttons,
410 Qt::KeyboardModifiers modifiers)
412 QPoint globalPos = fromNativeGlobalPixels(nativeGlobalPos);
414 QBasicDrag::drop(nativeGlobalPos, buttons, modifiers);
415 QWindow *window = topLevelAt(globalPos);
419 const QPoint pos = nativeGlobalPos - window->handle()->geometry().topLeft();
420 const QPlatformDropQtResponse response = QWindowSystemInterface::handleDrop(
421 window, drag()->mimeData(), pos, drag()->supportedActions(),
423 if (response.isAccepted()) {
424 setExecutedDropAction(response.acceptedAction());
426 setExecutedDropAction(Qt::IgnoreAction);