diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-10-07 12:28:39 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-10-10 13:26:37 +0200 |
commit | ae7b21898273a83b4b2669b9d30a7f9777a7af99 (patch) | |
tree | 36c29b1b0eb5d741885d1eae6922dcb7991f8305 /src/plugins/platforms/windows | |
parent | f7cb11d6f12f7bb353640637719292b95fd21438 (diff) |
Windows QPA: Improve reliability of clipboard retrieval
Clipboard retrieval sometimes fails due to the other application
having the clipboard locked. Retry opening the clipboard.
The choice of parameters is empirical, they have been observed
to prevent failures for MS Office applications at least.
Fixes: QTBUG-53979
Change-Id: Icbcaee149f0d377f33b222cdafbb2a21a7f1cf9d
Reviewed-by: André de la Rocha <andre.rocha@qt.io>
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Diffstat (limited to 'src/plugins/platforms/windows')
-rw-r--r-- | src/plugins/platforms/windows/qwindowsclipboard.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/plugins/platforms/windows/qwindowsclipboard.cpp b/src/plugins/platforms/windows/qwindowsclipboard.cpp index b87e43f3f7..4e6d3306e1 100644 --- a/src/plugins/platforms/windows/qwindowsclipboard.cpp +++ b/src/plugins/platforms/windows/qwindowsclipboard.cpp @@ -115,12 +115,21 @@ static QDebug operator<<(QDebug d, const QMimeData *mimeData) IDataObject *QWindowsClipboardRetrievalMimeData::retrieveDataObject() const { + enum : int { attempts = 3 }; IDataObject * pDataObj = nullptr; - if (OleGetClipboard(&pDataObj) == S_OK) { - if (QWindowsContext::verbose > 1) - qCDebug(lcQpaMime) << __FUNCTION__ << pDataObj; - return pDataObj; + // QTBUG-53979, retry in case the other application has clipboard locked + for (int i = 1; i <= attempts; ++i) { + if (SUCCEEDED(OleGetClipboard(&pDataObj))) { + if (QWindowsContext::verbose > 1) + qCDebug(lcQpaMime) << __FUNCTION__ << pDataObj; + return pDataObj; + } + qCWarning(lcQpaMime, i == attempts + ? "Unable to obtain clipboard." + : "Retrying to obtain clipboard."); + QThread::msleep(50); } + return nullptr; } |