summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@digia.com>2014-02-20 14:39:28 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-20 20:27:42 +0100
commit42afcfd8ce2fec86836d2414ee1e6d88f42613f3 (patch)
tree74c1809684a6f379bf50a77b9d8b1af6d2e8c962 /src/plugins
parent22f0dc4f893581f53d1f030587ae535128afccf8 (diff)
Windows: Ensure clipboard is flushed out before QGuiApplication is destroyed.
Otherwise, OleFlushClipboard() might query the data again which causes problems for QMimeData-derived classes using QPixmap/QImage. Task-number: QTBUG-36958 Change-Id: I89e58eeb64bd3481e89ad789f310f19ddb4604a2 Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/windows/qwindowsclipboard.cpp18
-rw-r--r--src/plugins/platforms/windows/qwindowsclipboard.h1
2 files changed, 18 insertions, 1 deletions
diff --git a/src/plugins/platforms/windows/qwindowsclipboard.cpp b/src/plugins/platforms/windows/qwindowsclipboard.cpp
index 5370d556fd..dcfeba12fa 100644
--- a/src/plugins/platforms/windows/qwindowsclipboard.cpp
+++ b/src/plugins/platforms/windows/qwindowsclipboard.cpp
@@ -132,19 +132,35 @@ extern "C" LRESULT QT_WIN_CALLBACK qClipboardViewerWndProc(HWND hwnd, UINT messa
return DefWindowProc(hwnd, message, wParam, lParam);
}
+// QTBUG-36958, ensure the clipboard is flushed before
+// QGuiApplication is destroyed since OleFlushClipboard()
+// might query the data again which causes problems
+// for QMimeData-derived classes using QPixmap/QImage.
+static void cleanClipboardPostRoutine()
+{
+ if (QWindowsClipboard *cl = QWindowsClipboard::instance())
+ cl->cleanup();
+}
+
QWindowsClipboard *QWindowsClipboard::m_instance = 0;
QWindowsClipboard::QWindowsClipboard() :
m_data(0), m_clipboardViewer(0), m_nextClipboardViewer(0)
{
QWindowsClipboard::m_instance = this;
+ qAddPostRoutine(cleanClipboardPostRoutine);
}
QWindowsClipboard::~QWindowsClipboard()
{
+ cleanup();
+ QWindowsClipboard::m_instance = 0;
+}
+
+void QWindowsClipboard::cleanup()
+{
unregisterViewer(); // Should release data if owner.
releaseIData();
- QWindowsClipboard::m_instance = 0;
}
void QWindowsClipboard::releaseIData()
diff --git a/src/plugins/platforms/windows/qwindowsclipboard.h b/src/plugins/platforms/windows/qwindowsclipboard.h
index ad7ee6437f..30bc0143f4 100644
--- a/src/plugins/platforms/windows/qwindowsclipboard.h
+++ b/src/plugins/platforms/windows/qwindowsclipboard.h
@@ -64,6 +64,7 @@ public:
QWindowsClipboard();
~QWindowsClipboard();
void registerViewer(); // Call in initialization, when context is up.
+ void cleanup();
virtual QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard);
virtual void setMimeData(QMimeData *data, QClipboard::Mode mode = QClipboard::Clipboard);