summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel/qdnd.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@nokia.com>2011-05-31 20:45:27 +0200
committerLars Knoll <lars.knoll@nokia.com>2011-06-01 09:55:39 +0200
commit38745b341c5c4d49fdb0e87f79f2714f105f63fe (patch)
tree50b9d0dc446758258f034e1d7ec188a16c2b8217 /src/gui/kernel/qdnd.cpp
parent07f8aecb52571d6a2d04133c24d8b8cd68769470 (diff)
add a platform interface for DnD
Use the simple in process DnD implementation for xcb.
Diffstat (limited to 'src/gui/kernel/qdnd.cpp')
-rw-r--r--src/gui/kernel/qdnd.cpp174
1 files changed, 40 insertions, 134 deletions
diff --git a/src/gui/kernel/qdnd.cpp b/src/gui/kernel/qdnd.cpp
index f9d51f442b..ae2f3779a8 100644
--- a/src/gui/kernel/qdnd.cpp
+++ b/src/gui/kernel/qdnd.cpp
@@ -58,6 +58,7 @@
#include "qimagewriter.h"
#include "qdebug.h"
#include <ctype.h>
+#include <qplatformdrag_qpa.h>
#include <private/qguiapplication_p.h>
@@ -121,19 +122,6 @@ QString KeyboardModifiersToString(Qt::KeyboardModifiers moderfies)
}
#endif
-class QDropData : public QInternalMimeData
-{
-public:
- QDropData();
- ~QDropData();
-
-protected:
- bool hasFormat_sys(const QString &mimeType) const;
- QStringList formats_sys() const;
- QVariant retrieveData_sys(const QString &mimeType, QVariant::Type type) const;
-};
-
-
// the universe's only drag manager
QDragManager *QDragManager::instance = 0;
@@ -151,15 +139,19 @@ QDragManager::QDragManager()
restoreCursor = false;
willDrop = false;
eventLoop = 0;
- platformDropData = new QDropData();
currentDropTarget = 0;
#ifdef Q_WS_X11
xdndMimeTransferedPixmapIndex = 0;
#endif
- currentWindow = 0;
-
possible_actions = Qt::IgnoreAction;
+
+ QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration();
+ platformDrag = pi->drag();
+
+ platformDropData = 0;
+ if (platformDrag)
+ platformDropData = platformDrag->platformDropData();
}
@@ -170,7 +162,6 @@ QDragManager::~QDragManager()
QGuiApplication::restoreOverrideCursor();
#endif
instance = 0;
- delete platformDropData;
}
QDragManager *QDragManager::self()
@@ -304,8 +295,6 @@ static const char *const default_pm[] = {
"X X X X X X X",
};
-// Shift/Ctrl handling, and final drop status
-static Qt::DropAction global_accepted_action = Qt::CopyAction;
static Qt::KeyboardModifiers oldstate;
@@ -375,50 +364,6 @@ void QDragManager::updatePixmap()
}
}
-void QDragManager::move(const QMouseEvent *me)
-{
- QWindow *window = QGuiApplication::topLevelAt(me->globalPos());
- QPoint pos;
- if (window)
- pos = me->globalPos() - window->geometry().topLeft();
-
- if (me->buttons()) {
- Qt::DropAction prevAction = global_accepted_action;
-
- if (currentWindow != window) {
- if (currentWindow) {
- QDragLeaveEvent dle;
- QCoreApplication::sendEvent(currentWindow, &dle);
- willDrop = false;
- global_accepted_action = Qt::IgnoreAction;
- }
- currentWindow = window;
- if (currentWindow) {
- QDragEnterEvent dee(pos, possible_actions, dropData(), me->buttons(), me->modifiers());
- QCoreApplication::sendEvent(currentWindow, &dee);
- willDrop = dee.isAccepted() && dee.dropAction() != Qt::IgnoreAction;
- global_accepted_action = willDrop ? dee.dropAction() : Qt::IgnoreAction;
- }
- updateCursor();
- restoreCursor = true;
- } else if (window) {
- Q_ASSERT(currentWindow);
- QDragMoveEvent dme(pos, possible_actions, dropData(), me->buttons(), me->modifiers());
- if (global_accepted_action != Qt::IgnoreAction) {
- dme.setDropAction(global_accepted_action);
- dme.accept();
- }
- QCoreApplication::sendEvent(currentWindow, &dme);
- willDrop = dme.isAccepted();
- global_accepted_action = willDrop ? dme.dropAction() : Qt::IgnoreAction;
- updatePixmap();
- updateCursor();
- }
- if (global_accepted_action != prevAction)
- emitActionChanged(global_accepted_action);
- }
-}
-
void QDragManager::updateCursor()
{
#ifndef QT_NO_CURSOR
@@ -508,9 +453,14 @@ bool QDragManager::eventFilter(QObject *o, QEvent *e)
Qt::DropAction QDragManager::drag(QDrag *o)
{
- if (object == o || !o || !o->source())
+ if (!o || object == o)
return Qt::IgnoreAction;
+ if (!platformDrag || !o->source()) {
+ o->deleteLater();
+ return Qt::IgnoreAction;
+ }
+
if (object) {
cancel();
qApp->removeEventFilter(this);
@@ -526,9 +476,6 @@ Qt::DropAction QDragManager::drag(QDrag *o)
possible_actions = dragPrivate()->possible_actions;
willDrop = false;
- updatePixmap();
- updateCursor();
- restoreCursor = true;
object->d_func()->target = 0;
qApp->installEventFilter(this);
@@ -538,6 +485,7 @@ Qt::DropAction QDragManager::drag(QDrag *o)
restoreCursor = true;
updateCursor();
#endif
+ updatePixmap();
eventLoop = new QEventLoop;
(void) eventLoop->exec();
@@ -550,16 +498,18 @@ Qt::DropAction QDragManager::drag(QDrag *o)
return global_accepted_action;
}
-
-void QDragManager::cancel(bool deleteSource)
+void QDragManager::move(const QMouseEvent *me)
{
-// qDebug("QDragManager::cancel");
- beingCancelled = true;
+ if (!platformDrag)
+ return;
- if (object->target()) {
- QDragLeaveEvent dle;
- QCoreApplication::sendEvent(object->target(), &dle);
- }
+ platformDrag->move(me);
+}
+
+void QDragManager::drop(const QMouseEvent *me)
+{
+ if (!platformDrag)
+ return;
#ifndef QT_NO_CURSOR
if (restoreCursor) {
@@ -567,22 +517,20 @@ void QDragManager::cancel(bool deleteSource)
restoreCursor = false;
}
#endif
+ willDrop = false;
- if (object) {
- if (deleteSource)
- object->deleteLater();
- object = 0;
- }
-
- delete qt_qws_dnd_deco;
- qt_qws_dnd_deco = 0;
+ platformDrag->drop(me);
- global_accepted_action = Qt::IgnoreAction;
+ if (object)
+ object->deleteLater();
+ object = 0;
}
-
-void QDragManager::drop(const QMouseEvent *me)
+void QDragManager::cancel(bool deleteSource)
{
+ if (!platformDrag)
+ return;
+
#ifndef QT_NO_CURSOR
if (restoreCursor) {
QGuiApplication::restoreOverrideCursor();
@@ -590,57 +538,15 @@ void QDragManager::drop(const QMouseEvent *me)
}
#endif
- willDrop = false;
- QWindow *window = QGuiApplication::topLevelAt(me->globalPos());
-
- if (window) {
- QPoint pos = me->globalPos() - window->geometry().topLeft();
-
- QDropEvent de(pos, possible_actions, dropData(), me->buttons(), me->modifiers());
- QCoreApplication::sendEvent(window, &de);
- if (de.isAccepted())
- global_accepted_action = de.dropAction();
- else
- global_accepted_action = Qt::IgnoreAction;
-
- if (object)
- object->deleteLater();
- object = 0;
- }
- currentWindow = 0;
-}
-
-QDropData::QDropData()
- : QInternalMimeData()
-{
-}
-
-QDropData::~QDropData()
-{
-}
+ beingCancelled = true;
-QVariant QDropData::retrieveData_sys(const QString &mimetype, QVariant::Type type) const
-{
- QDrag *object = QDragManager::self()->object;
- if (!object)
- return QVariant();
- QByteArray data = object->mimeData()->data(mimetype);
- if (type == QVariant::String)
- return QString::fromUtf8(data);
- return data;
-}
+ platformDrag->cancel();
-bool QDropData::hasFormat_sys(const QString &format) const
-{
- return formats().contains(format);
-}
+ if (object && deleteSource)
+ object->deleteLater();
+ object = 0;
-QStringList QDropData::formats_sys() const
-{
- QDrag *object = QDragManager::self()->object;
- if (object)
- return object->mimeData()->formats();
- return QStringList();
+ global_accepted_action = Qt::IgnoreAction;
}
#endif // QT_NO_DRAGANDDROP