aboutsummaryrefslogtreecommitdiffhomepage
path: root/qt/ScintillaEditBase/ScintillaQt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qt/ScintillaEditBase/ScintillaQt.cpp')
-rw-r--r--qt/ScintillaEditBase/ScintillaQt.cpp38
1 files changed, 27 insertions, 11 deletions
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 <QScrollBar>
#include <QTimer>
#include <QTextCodec>
+#include <QThread>
#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()