From ed912471bd449044ddc36b902ebb32b53ee548de Mon Sep 17 00:00:00 2001 From: Giulio Camuffo Date: Fri, 12 Sep 2014 13:44:42 +0300 Subject: Fix retrieving the selection/dnd data Installing a roudtrip on the custom event queue in the wl_data_offer.offer handler is broken because that triggers a wl_data_device.selection event, which emits the QClipboard changed signal, so code listening to it may end up trying to retrieve the clipboard data before the roundtrip ends. Additionally, we're calling wl_data_offer.receive for each mime type, even if then we never read from the fd, making the source client do work for no reason. Instead, call wl_data_offer.receive retrieveData_sys, that is when actually retreiving the data. We don't need to install a roundtrip after that, just flushing out the requests is enough, because we wait up to one second for the source client to write into the fd. Change-Id: I180779e375ebd5a22af7084458505a41107fab19 Reviewed-by: Robin Burchell --- src/client/qwaylanddataoffer.cpp | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) (limited to 'src/client/qwaylanddataoffer.cpp') diff --git a/src/client/qwaylanddataoffer.cpp b/src/client/qwaylanddataoffer.cpp index d1c85c7a4..4ad73dc7e 100644 --- a/src/client/qwaylanddataoffer.cpp +++ b/src/client/qwaylanddataoffer.cpp @@ -94,30 +94,18 @@ QWaylandMimeData::~QWaylandMimeData() void QWaylandMimeData::appendFormat(const QString &mimeType) { - if (m_types.contains(mimeType)) - close(m_types.take(mimeType)); // Unconsumed data + m_types << mimeType; m_data.remove(mimeType); // Clear previous contents - - int pipefd[2]; - if (::pipe2(pipefd, O_CLOEXEC|O_NONBLOCK) == -1) { - qWarning("QWaylandMimeData: pipe2() failed"); - return; - } - - m_dataOffer->receive(mimeType, pipefd[1]); - m_display->forceRoundTrip(); - close(pipefd[1]); - m_types.insert(mimeType, pipefd[0]); } bool QWaylandMimeData::hasFormat_sys(const QString &mimeType) const { - return m_types.contains(mimeType) || m_data.contains(mimeType); + return m_types.contains(mimeType); } QStringList QWaylandMimeData::formats_sys() const { - return m_types.keys() << m_data.keys(); + return m_types; } QVariant QWaylandMimeData::retrieveData_sys(const QString &mimeType, QVariant::Type type) const @@ -130,14 +118,24 @@ QVariant QWaylandMimeData::retrieveData_sys(const QString &mimeType, QVariant::T if (!m_types.contains(mimeType)) return QVariant(); + int pipefd[2]; + if (::pipe2(pipefd, O_CLOEXEC|O_NONBLOCK) == -1) { + qWarning("QWaylandMimeData: pipe2() failed"); + return QVariant(); + } + + m_dataOffer->receive(mimeType, pipefd[1]); + m_display->flushRequests(); + + close(pipefd[1]); + QByteArray content; - int fd = m_types.take(mimeType); - if (readData(fd, content) != 0) { + if (readData(pipefd[0], content) != 0) { qWarning("QWaylandDataOffer: error reading data for mimeType %s", qPrintable(mimeType)); content = QByteArray(); } - close(fd); + close(pipefd[0]); m_data.insert(mimeType, content); return content; } -- cgit v1.2.3