ClipboardUtils: loop on Linux

This commit is contained in:
Le Tan 2018-09-01 18:58:14 +08:00
parent 22489137ae
commit 5d0b45715d

View File

@ -9,8 +9,9 @@ void VClipboardUtils::setImageToClipboard(QClipboard *p_clipboard,
const QImage &p_image, const QImage &p_image,
QClipboard::Mode p_mode) QClipboard::Mode p_mode)
{ {
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN) || defined(Q_OS_LINUX)
// On Windows, setImage() may fail. We will repeatedly retry until succeed. // On Windows, setImage() may fail. We will repeatedly retry until succeed.
// On Linux, QXcbClipboard::setMimeData: Cannot set X11 selection owner.
setImageLoop(p_clipboard, p_image, p_mode); setImageLoop(p_clipboard, p_image, p_mode);
#else #else
p_clipboard->setImage(p_image, p_mode); p_clipboard->setImage(p_image, p_mode);
@ -21,7 +22,7 @@ void VClipboardUtils::setImageLoop(QClipboard *p_clipboard,
const QImage &p_image, const QImage &p_image,
QClipboard::Mode p_mode) QClipboard::Mode p_mode)
{ {
while (true) { for (int i = 0; i < 100; ++i) {
p_clipboard->setImage(p_image, p_mode); p_clipboard->setImage(p_image, p_mode);
QImage image = p_clipboard->image(p_mode); QImage image = p_clipboard->image(p_mode);
@ -29,7 +30,7 @@ void VClipboardUtils::setImageLoop(QClipboard *p_clipboard,
break; break;
} }
qDebug() << "fail to set image, retry"; qWarning() << "fail to set image, retry" << i;
VUtils::sleepWait(100 /* ms */); VUtils::sleepWait(100 /* ms */);
} }
@ -41,8 +42,9 @@ void VClipboardUtils::setImageToClipboard(QClipboard *p_clipboard,
{ {
QImage img(p_image.toImage()); QImage img(p_image.toImage());
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN) || defined(Q_OS_LINUX)
// On Windows, setImage() may fail. We will repeatedly retry until succeed. // On Windows, setImage() may fail. We will repeatedly retry until succeed.
// On Linux, QXcbClipboard::setMimeData: Cannot set X11 selection owner.
setImageLoop(p_clipboard, img, p_mode); setImageLoop(p_clipboard, img, p_mode);
#else #else
p_clipboard->setImage(img, p_mode); p_clipboard->setImage(img, p_mode);
@ -53,8 +55,9 @@ void VClipboardUtils::setMimeDataToClipboard(QClipboard *p_clipboard,
QMimeData *p_mimeData, QMimeData *p_mimeData,
QClipboard::Mode p_mode) QClipboard::Mode p_mode)
{ {
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN) || defined(Q_OS_LINUX)
// On Windows, setMimeData() may fail. We will repeatedly retry until succeed. // On Windows, setMimeData() may fail. We will repeatedly retry until succeed.
// On Linux, QXcbClipboard::setMimeData: Cannot set X11 selection owner.
setMimeDataLoop(p_clipboard, p_mimeData, p_mode); setMimeDataLoop(p_clipboard, p_mimeData, p_mode);
#else #else
p_clipboard->setMimeData(p_mimeData, p_mode); p_clipboard->setMimeData(p_mimeData, p_mode);
@ -160,7 +163,7 @@ void VClipboardUtils::setMimeDataLoop(QClipboard *p_clipboard,
QMimeData *p_mimeData, QMimeData *p_mimeData,
QClipboard::Mode p_mode) QClipboard::Mode p_mode)
{ {
while (true) { for (int i = 0; i < 100; ++i) {
// Make a backup. // Make a backup.
QMimeData *tmp = cloneMimeData(p_mimeData); QMimeData *tmp = cloneMimeData(p_mimeData);
@ -171,7 +174,7 @@ void VClipboardUtils::setMimeDataLoop(QClipboard *p_clipboard,
break; break;
} }
qDebug() << "fail to set mimeData, retry"; qDebug() << "fail to set mimeData, retry" << i;
p_mimeData = tmp; p_mimeData = tmp;
VUtils::sleepWait(100 /* ms */); VUtils::sleepWait(100 /* ms */);