diff options
-rw-r--r-- | src/gui/kernel/qguiapplication.cpp | 46 | ||||
-rw-r--r-- | src/gui/kernel/qguiapplication_p.h | 3 | ||||
-rw-r--r-- | src/gui/kernel/qwindowsysteminterface_qpa.cpp | 10 | ||||
-rw-r--r-- | src/gui/kernel/qwindowsysteminterface_qpa.h | 6 |
4 files changed, 65 insertions, 0 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index b44503141e..6edf71ad3d 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -62,6 +62,7 @@ #include "private/qwindow_p.h" #include "private/qkeymapper_p.h" #include "private/qcursor_p.h" +#include "private/qdnd_p.h" #ifndef QT_NO_CURSOR #include "qplatformcursor_qpa.h" #endif @@ -755,6 +756,51 @@ void QGuiApplicationPrivate::processExposeEvent(QWindowSystemInterfacePrivate::E QCoreApplication::sendSpontaneousEvent(e->exposed.data(), &event); } +Qt::DropAction QGuiApplicationPrivate::processDrag(QWindow *w, QMimeData *dropData, const QPoint &p) +{ + static QPointer<QWindow> currentDragWindow; + QDragManager *manager = QDragManager::self(); + if (!dropData) { + if (currentDragWindow.data() == w) + currentDragWindow = 0; + QDragLeaveEvent e; + QGuiApplication::sendEvent(w, &e); + manager->global_accepted_action = Qt::IgnoreAction; + return Qt::IgnoreAction; + } + QDragMoveEvent me(p, manager->possible_actions, dropData, + QGuiApplication::mouseButtons(), QGuiApplication::keyboardModifiers()); + if (w != currentDragWindow) { + if (currentDragWindow) { + QDragLeaveEvent e; + QGuiApplication::sendEvent(currentDragWindow, &e); + manager->global_accepted_action = Qt::IgnoreAction; + } + currentDragWindow = w; + QDragEnterEvent e(p, manager->possible_actions, dropData, + QGuiApplication::mouseButtons(), QGuiApplication::keyboardModifiers()); + QGuiApplication::sendEvent(w, &e); + manager->global_accepted_action = e.isAccepted() ? e.dropAction() : Qt::IgnoreAction; + if (manager->global_accepted_action != Qt::IgnoreAction) { + me.setDropAction(manager->global_accepted_action); + me.accept(); + } + } + QGuiApplication::sendEvent(w, &me); + manager->global_accepted_action = me.isAccepted() ? me.dropAction() : Qt::IgnoreAction; + return manager->global_accepted_action; +} + +Qt::DropAction QGuiApplicationPrivate::processDrop(QWindow *w, QMimeData *dropData, const QPoint &p) +{ + QDragManager *manager = QDragManager::self(); + QDropEvent de(p, manager->possible_actions, dropData, + QGuiApplication::mouseButtons(), QGuiApplication::keyboardModifiers()); + QGuiApplication::sendEvent(w, &de); + manager->global_accepted_action = de.isAccepted() ? de.dropAction() : Qt::IgnoreAction; + return manager->global_accepted_action; +} + #ifndef QT_NO_CLIPBOARD QClipboard * QGuiApplication::clipboard() { diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index 8391662a4a..a08dbca4f1 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -125,6 +125,9 @@ public: static void processExposeEvent(QWindowSystemInterfacePrivate::ExposeEvent *e); + static Qt::DropAction processDrag(QWindow *w, QMimeData *dropData, const QPoint &p); + static Qt::DropAction processDrop(QWindow *w, QMimeData *dropData, const QPoint &p); + static inline Qt::Alignment visualAlignment(Qt::LayoutDirection direction, Qt::Alignment alignment) { if (!(alignment & Qt::AlignHorizontal_Mask)) diff --git a/src/gui/kernel/qwindowsysteminterface_qpa.cpp b/src/gui/kernel/qwindowsysteminterface_qpa.cpp index cde46acbdf..e6fbd5b875 100644 --- a/src/gui/kernel/qwindowsysteminterface_qpa.cpp +++ b/src/gui/kernel/qwindowsysteminterface_qpa.cpp @@ -308,4 +308,14 @@ int QWindowSystemInterface::windowSystemEventsQueued() return QWindowSystemInterfacePrivate::windowSystemEventsQueued(); } +Qt::DropAction QWindowSystemInterface::handleDrag(QWindow *w, QMimeData *dropData, const QPoint &p) +{ + return QGuiApplicationPrivate::processDrag(w, dropData, p); +} + +Qt::DropAction QWindowSystemInterface::handleDrop(QWindow *w, QMimeData *dropData, const QPoint &p) +{ + return QGuiApplicationPrivate::processDrop(w, dropData, p); +} + QT_END_NAMESPACE diff --git a/src/gui/kernel/qwindowsysteminterface_qpa.h b/src/gui/kernel/qwindowsysteminterface_qpa.h index 07963b6f97..7df7c2deb4 100644 --- a/src/gui/kernel/qwindowsysteminterface_qpa.h +++ b/src/gui/kernel/qwindowsysteminterface_qpa.h @@ -55,6 +55,8 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE +class QMimeData; + QT_MODULE(Gui) class Q_GUI_EXPORT QWindowSystemInterface @@ -103,6 +105,10 @@ public: static void handleExposeEvent(QWindow *w, const QRegion ®ion); + // Drag and drop. These events are sent immediately. + static Qt::DropAction handleDrag(QWindow *w, QMimeData *dropData, const QPoint &p); + static Qt::DropAction handleDrop(QWindow *w, QMimeData *dropData, const QPoint &p); + // Changes to the screen static void handleScreenGeometryChange(int screenIndex); static void handleScreenAvailableGeometryChange(int screenIndex); |