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>
bb10
Friedemann Kleint 2014-02-20 14:39:28 +01:00 committed by The Qt Project
parent 22f0dc4f89
commit 42afcfd8ce
2 changed files with 18 additions and 1 deletions

View File

@ -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()

View File

@ -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);