From a5e3e9eaf16e4b146659f4f5b9227fb2435ee8f2 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Mon, 6 Aug 2012 15:31:11 +0200 Subject: [PATCH] Don't let mimeData return 0. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes bug introduced in SHA e247e2810 (QTBUG-26709). Change-Id: I9aa80239675b2d564d08a019ca267a9aa814074e Reviewed-by: David Faure Reviewed-by: Friedemann Kleint Reviewed-by: Samuel Rødal --- src/plugins/platforms/xcb/qxcbclipboard.cpp | 37 ++++++++++++++------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp index 1fe6732db1..3a9eaefa62 100644 --- a/src/plugins/platforms/xcb/qxcbclipboard.cpp +++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp @@ -81,12 +81,20 @@ public: } } - void reset() { formatList.clear(); } + void reset() + { + formatList.clear(); + } + + bool isEmpty() const + { + return m_clipboard->getSelectionOwner(modeAtom) == XCB_NONE; + } protected: QStringList formats_sys() const { - if (empty()) + if (isEmpty()) return QStringList(); if (!formatList.count()) { @@ -122,7 +130,7 @@ protected: QVariant retrieveData_sys(const QString &fmt, QVariant::Type requestedType) const { - if (fmt.isEmpty() || empty()) + if (fmt.isEmpty() || isEmpty()) return QByteArray(); (void)formats(); // trigger update of format list @@ -142,11 +150,6 @@ protected: return mimeConvertToFormat(m_clipboard->connection(), fmtatom, m_clipboard->getDataInFormat(modeAtom, fmtatom), fmt, requestedType, encoding); } private: - bool empty() const - { - return m_clipboard->getSelectionOwner(modeAtom) == XCB_NONE; - } - xcb_atom_t modeAtom; QXcbClipboard *m_clipboard; @@ -259,9 +262,6 @@ QMimeData * QXcbClipboard::mimeData(QClipboard::Mode mode) return 0; xcb_window_t clipboardOwner = getSelectionOwner(atomForMode(mode)); - if (clipboardOwner == XCB_NONE) - return 0; - if (clipboardOwner == owner()) { return m_clientClipboard[mode]; } else { @@ -274,7 +274,20 @@ QMimeData * QXcbClipboard::mimeData(QClipboard::Mode mode) void QXcbClipboard::setMimeData(QMimeData *data, QClipboard::Mode mode) { - if ((mode > QClipboard::Selection) || (mimeData(mode) == data)) + if (mode > QClipboard::Selection) + return; + + QXcbClipboardMime *xClipboard = 0; + // verify if there is data to be cleared on global X Clipboard. + if (!data) { + xClipboard = qobject_cast(mimeData(mode)); + if (xClipboard) { + if (xClipboard->isEmpty()) + return; + } + } + + if (!xClipboard && (m_clientClipboard[mode] == data)) return; xcb_atom_t modeAtom = atomForMode(mode);