From 42afcfd8ce2fec86836d2414ee1e6d88f42613f3 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 20 Feb 2014 14:39:28 +0100 Subject: [PATCH] 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 --- .../platforms/windows/qwindowsclipboard.cpp | 18 +++++++++++++++++- .../platforms/windows/qwindowsclipboard.h | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) 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);