From 3163777c1d30783a35b73b3e79cf39179d21feee Mon Sep 17 00:00:00 2001 From: Jason Hallam Date: Wed, 24 Feb 2016 10:47:02 +1100 Subject: Retry copying to clipboard if it fails as another application may have opened it --- qt/ScintillaEditBase/ScintillaQt.cpp | 38 +++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) (limited to 'qt/ScintillaEditBase/ScintillaQt.cpp') diff --git a/qt/ScintillaEditBase/ScintillaQt.cpp b/qt/ScintillaEditBase/ScintillaQt.cpp index 3b7db8002..e4bbb5c1d 100644 --- a/qt/ScintillaEditBase/ScintillaQt.cpp +++ b/qt/ScintillaEditBase/ScintillaQt.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #ifdef SCI_NAMESPACE using namespace Scintilla; @@ -306,21 +307,36 @@ void ScintillaQt::ReconfigureScrollBars() } } +static bool clipboardAccessFailed; +static void ClipboardMessageHandler(QtMsgType, const QMessageLogContext &, const QString &) +{ + clipboardAccessFailed = true; +} + void ScintillaQt::CopyToModeClipboard(const SelectionText &selectedText, QClipboard::Mode clipboardMode_) { - QClipboard *clipboard = QApplication::clipboard(); - clipboard->clear(clipboardMode_); - QString su = StringFromSelectedText(selectedText); - QMimeData *mimeData = new QMimeData(); - mimeData->setText(su); - if (selectedText.rectangular) { - AddRectangularToMime(mimeData, su); - } + // Try up to 8 times, with an initial delay of 1 ms and an exponential + // back off for a maximum total delay of 127 ms (1+2+4+8+16+32+64). + QString text = StringFromSelectedText(selectedText); + for (int attempt = 0; attempt < 8; attempt++) { + if (attempt > 0) + QThread::msleep(1 << (attempt-1)); + + QMimeData *mimeData = new QMimeData; + mimeData->setText(text); + if (selectedText.rectangular) + AddRectangularToMime(mimeData, text); - // Allow client code to add additional data (e.g rich text). - emit aboutToCopy(mimeData); + // Allow client code to add additional data (e.g rich text). + emit aboutToCopy(mimeData); - clipboard->setMimeData(mimeData, clipboardMode_); + clipboardAccessFailed = false; + QtMessageHandler handler = qInstallMessageHandler(ClipboardMessageHandler); + QApplication::clipboard()->setMimeData(mimeData, clipboardMode_); + qInstallMessageHandler(handler); + if (!clipboardAccessFailed) + return; + } } void ScintillaQt::Copy() -- cgit v1.2.3