summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.p.agocs@nokia.com>2011-05-10 09:17:27 +0200
committerLaszlo Agocs <laszlo.p.agocs@nokia.com>2011-05-10 09:17:55 +0200
commit04549f2eedd183c98f192e1669a4b483cfb017e7 (patch)
tree4d7a85510b5fcbfba203160ae7e629429cafac6c /src/plugins
parent8fb592846930f09ff465442fd10e522226963968 (diff)
Retrieve the actual data in the Wayland clipboard only when requested.
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/wayland/qwaylandclipboard.cpp86
-rw-r--r--src/plugins/platforms/wayland/qwaylandclipboard.h6
2 files changed, 69 insertions, 23 deletions
diff --git a/src/plugins/platforms/wayland/qwaylandclipboard.cpp b/src/plugins/platforms/wayland/qwaylandclipboard.cpp
index 9c533aa98b..9a363b5f8f 100644
--- a/src/plugins/platforms/wayland/qwaylandclipboard.cpp
+++ b/src/plugins/platforms/wayland/qwaylandclipboard.cpp
@@ -48,9 +48,48 @@
#include <QtCore/QStringList>
#include <QtCore/QFile>
#include <QtCore/QtDebug>
+#include <QtGui/private/qdnd_p.h>
static QWaylandClipboard *clipboard;
+class QWaylandMimeData : public QInternalMimeData
+{
+public:
+ void clearAll();
+ void setFormats(const QStringList &formatList);
+ bool hasFormat_sys(const QString &mimeType) const;
+ QStringList formats_sys() const;
+ QVariant retrieveData_sys(const QString &mimeType, QVariant::Type type) const;
+private:
+ QStringList mFormatList;
+};
+
+void QWaylandMimeData::clearAll()
+{
+ clear();
+ mFormatList.clear();
+}
+
+void QWaylandMimeData::setFormats(const QStringList &formatList)
+{
+ mFormatList = formatList;
+}
+
+bool QWaylandMimeData::hasFormat_sys(const QString &mimeType) const
+{
+ return formats().contains(mimeType);
+}
+
+QStringList QWaylandMimeData::formats_sys() const
+{
+ return mFormatList;
+}
+
+QVariant QWaylandMimeData::retrieveData_sys(const QString &mimeType, QVariant::Type type) const
+{
+ return clipboard->retrieveData(mimeType, type);
+}
+
class QWaylandSelection
{
public:
@@ -157,32 +196,35 @@ void QWaylandClipboard::forceRoundtrip(struct wl_display *display)
wl_display_iterate(display, WL_DISPLAY_READABLE);
}
+QVariant QWaylandClipboard::retrieveData(const QString &mimeType, QVariant::Type type) const
+{
+ Q_UNUSED(type);
+ int pipefd[2];
+ if (pipe(pipefd) == -1) {
+ qWarning("QWaylandClipboard: pipe() failed");
+ return QVariant();
+ }
+ QByteArray mimeTypeBa = mimeType.toLatin1();
+ wl_selection_offer_receive(mOffer, mimeTypeBa.constData(), pipefd[1]);
+ QByteArray content;
+ forceRoundtrip(mDisplay->wl_display());
+ char buf[256];
+ int n;
+ close(pipefd[1]);
+ while ((n = read(pipefd[0], &buf, sizeof buf)) > 0)
+ content.append(buf, n);
+ close(pipefd[0]);
+ return content;
+}
+
const QMimeData *QWaylandClipboard::mimeData(QClipboard::Mode mode) const
{
Q_ASSERT(mode == QClipboard::Clipboard);
if (!mMimeDataIn)
- mMimeDataIn = new QMimeData;
- mMimeDataIn->clear();
- if (!mOfferedMimeTypes.isEmpty() && mOffer) {
- foreach (const QString &mimeType, mOfferedMimeTypes) {
- int pipefd[2];
- if (pipe(pipefd) == -1) {
- qWarning("QWaylandClipboard::mimedata: pipe() failed");
- break;
- }
- QByteArray mimeTypeBa = mimeType.toLatin1();
- wl_selection_offer_receive(mOffer, mimeTypeBa.constData(), pipefd[1]);
- QByteArray content;
- forceRoundtrip(mDisplay->wl_display());
- char buf[256];
- int n;
- close(pipefd[1]);
- while ((n = read(pipefd[0], &buf, sizeof buf)) > 0)
- content.append(buf, n);
- close(pipefd[0]);
- mMimeDataIn->setData(mimeType, content);
- }
- }
+ mMimeDataIn = new QWaylandMimeData;
+ mMimeDataIn->clearAll();
+ if (!mOfferedMimeTypes.isEmpty() && mOffer)
+ mMimeDataIn->setFormats(mOfferedMimeTypes);
return mMimeDataIn;
}
diff --git a/src/plugins/platforms/wayland/qwaylandclipboard.h b/src/plugins/platforms/wayland/qwaylandclipboard.h
index 606a1f6c55..b0d63949fb 100644
--- a/src/plugins/platforms/wayland/qwaylandclipboard.h
+++ b/src/plugins/platforms/wayland/qwaylandclipboard.h
@@ -44,9 +44,11 @@
#include <QtGui/QPlatformClipboard>
#include <QtCore/QStringList>
+#include <QtCore/QVariant>
class QWaylandDisplay;
class QWaylandSelection;
+class QWaylandMimeData;
struct wl_selection_offer;
class QWaylandClipboard : public QPlatformClipboard
@@ -63,6 +65,8 @@ public:
void createSelectionOffer(uint32_t id);
+ QVariant retrieveData(const QString &mimeType, QVariant::Type type) const;
+
private:
static void offer(void *data,
struct wl_selection_offer *selection_offer,
@@ -77,7 +81,7 @@ private:
QWaylandDisplay *mDisplay;
QWaylandSelection *mSelection;
- mutable QMimeData *mMimeDataIn;
+ mutable QWaylandMimeData *mMimeDataIn;
QList<QWaylandSelection *> mSelections;
QStringList mOfferedMimeTypes;
struct wl_selection_offer *mOffer;