From 3e7fa998ee197a93c88b460ce08029299e5ef468 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Sat, 25 Nov 2017 09:20:29 +0800 Subject: [PATCH] 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. --- src/src.pro | 6 ++++-- src/utils/vclipboardutils.cpp | 35 +++++++++++++++++++++++++++++++++++ src/utils/vclipboardutils.h | 25 +++++++++++++++++++++++++ src/vwebview.cpp | 3 ++- 4 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 src/utils/vclipboardutils.cpp create mode 100644 src/utils/vclipboardutils.h diff --git a/src/src.pro b/src/src.pro index 67114f9b..edd7cdd3 100644 --- a/src/src.pro +++ b/src/src.pro @@ -98,7 +98,8 @@ SOURCES += main.cpp\ dialog/veditsnippetdialog.cpp \ utils/vimnavigationforwidget.cpp \ vtoolbox.cpp \ - vinsertselector.cpp + vinsertselector.cpp \ + utils/vclipboardutils.cpp HEADERS += vmainwindow.h \ vdirectorytree.h \ @@ -183,7 +184,8 @@ HEADERS += vmainwindow.h \ dialog/veditsnippetdialog.h \ utils/vimnavigationforwidget.h \ vtoolbox.h \ - vinsertselector.h + vinsertselector.h \ + utils/vclipboardutils.h RESOURCES += \ vnote.qrc \ diff --git a/src/utils/vclipboardutils.cpp b/src/utils/vclipboardutils.cpp new file mode 100644 index 00000000..8d2e513b --- /dev/null +++ b/src/utils/vclipboardutils.cpp @@ -0,0 +1,35 @@ +#include "vclipboardutils.h" + +#include + +#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 */); + } +} diff --git a/src/utils/vclipboardutils.h b/src/utils/vclipboardutils.h new file mode 100644 index 00000000..df50b3bc --- /dev/null +++ b/src/utils/vclipboardutils.h @@ -0,0 +1,25 @@ +#ifndef VCLIPBOARDUTILS_H +#define VCLIPBOARDUTILS_H + +#include +#include + + +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 diff --git a/src/vwebview.cpp b/src/vwebview.cpp index fc554f96..ba58e771 100644 --- a/src/vwebview.cpp +++ b/src/vwebview.cpp @@ -11,6 +11,7 @@ #include #include #include "vfile.h" +#include "utils/vclipboardutils.h" // We set the property of the clipboard to mark that the URL copied in the // clipboard has been altered. @@ -133,7 +134,7 @@ void VWebView::copyImage() if (!imgPath.isEmpty()) { QImage img(imgPath); if (!img.isNull()) { - clipboard->setImage(img, QClipboard::Clipboard); + VClipboardUtils::setImageToClipboard(clipboard, img, QClipboard::Clipboard); qDebug() << "clipboard copy image via URL" << imgPath; return; }