diff options
author | Friedemann Kleint <Friedemann.Kleint@digia.com> | 2014-02-20 14:39:28 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-02-20 20:27:42 +0100 |
commit | 42afcfd8ce2fec86836d2414ee1e6d88f42613f3 (patch) | |
tree | 74c1809684a6f379bf50a77b9d8b1af6d2e8c962 /src/plugins/platforms/windows/qwindowsclipboard.cpp | |
parent | 22f0dc4f893581f53d1f030587ae535128afccf8 (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/platforms/windows/qwindowsclipboard.cpp')
-rw-r--r-- | src/plugins/platforms/windows/qwindowsclipboard.cpp | 18 |
1 files changed, 17 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() |