bug-fix: retry to set clipboard after failure on Windows

On Windows, set data to clipboard may fail due to operating system's
design. We will repeatedly retry untin succeed.
This commit is contained in:
Le Tan 2017-11-25 09:20:29 +08:00
parent d3ff787153
commit 3e7fa998ee
4 changed files with 66 additions and 3 deletions

View File

@ -98,7 +98,8 @@ SOURCES += main.cpp\
dialog/veditsnippetdialog.cpp \ dialog/veditsnippetdialog.cpp \
utils/vimnavigationforwidget.cpp \ utils/vimnavigationforwidget.cpp \
vtoolbox.cpp \ vtoolbox.cpp \
vinsertselector.cpp vinsertselector.cpp \
utils/vclipboardutils.cpp
HEADERS += vmainwindow.h \ HEADERS += vmainwindow.h \
vdirectorytree.h \ vdirectorytree.h \
@ -183,7 +184,8 @@ HEADERS += vmainwindow.h \
dialog/veditsnippetdialog.h \ dialog/veditsnippetdialog.h \
utils/vimnavigationforwidget.h \ utils/vimnavigationforwidget.h \
vtoolbox.h \ vtoolbox.h \
vinsertselector.h vinsertselector.h \
utils/vclipboardutils.h
RESOURCES += \ RESOURCES += \
vnote.qrc \ vnote.qrc \

View File

@ -0,0 +1,35 @@
#include "vclipboardutils.h"
#include <QDebug>
#include "vutils.h"
void VClipboardUtils::setImageToClipboard(QClipboard *p_clipboard,
const QImage &p_image,
QClipboard::Mode p_mode)
{
#if defined(Q_OS_WIN)
// On Windows, setImage() may fail. We will repeatedly retry until succeed.
setImageLoop(p_clipboard, p_image, p_mode);
#else
p_clipboard->setImage(p_image, p_mode);
#endif
}
void VClipboardUtils::setImageLoop(QClipboard *p_clipboard,
const QImage &p_image,
QClipboard::Mode p_mode)
{
while (true) {
p_clipboard->setImage(p_image, p_mode);
QImage image = p_clipboard->image(p_mode);
if (!image.isNull()) {
break;
}
qDebug() << "fail to set image, retry";
VUtils::sleepWait(100 /* ms */);
}
}

View File

@ -0,0 +1,25 @@
#ifndef VCLIPBOARDUTILS_H
#define VCLIPBOARDUTILS_H
#include <QImage>
#include <QClipboard>
class VClipboardUtils
{
public:
static void setImageToClipboard(QClipboard *p_clipboard,
const QImage &p_image,
QClipboard::Mode p_mode = QClipboard::Clipboard);
private:
VClipboardUtils()
{
}
static void setImageLoop(QClipboard *p_clipboard,
const QImage &p_image,
QClipboard::Mode p_mode);
};
#endif // VCLIPBOARDUTILS_H

View File

@ -11,6 +11,7 @@
#include <QApplication> #include <QApplication>
#include <QImage> #include <QImage>
#include "vfile.h" #include "vfile.h"
#include "utils/vclipboardutils.h"
// We set the property of the clipboard to mark that the URL copied in the // We set the property of the clipboard to mark that the URL copied in the
// clipboard has been altered. // clipboard has been altered.
@ -133,7 +134,7 @@ void VWebView::copyImage()
if (!imgPath.isEmpty()) { if (!imgPath.isEmpty()) {
QImage img(imgPath); QImage img(imgPath);
if (!img.isNull()) { if (!img.isNull()) {
clipboard->setImage(img, QClipboard::Clipboard); VClipboardUtils::setImageToClipboard(clipboard, img, QClipboard::Clipboard);
qDebug() << "clipboard copy image via URL" << imgPath; qDebug() << "clipboard copy image via URL" << imgPath;
return; return;
} }