Browse Source

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.
Le Tan 8 years ago
parent
commit
3e7fa998ee
4 changed files with 66 additions and 3 deletions
  1. 4 2
      src/src.pro
  2. 35 0
      src/utils/vclipboardutils.cpp
  3. 25 0
      src/utils/vclipboardutils.h
  4. 2 1
      src/vwebview.cpp

+ 4 - 2
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 \

+ 35 - 0
src/utils/vclipboardutils.cpp

@@ -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 */);
+    }
+}

+ 25 - 0
src/utils/vclipboardutils.h

@@ -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

+ 2 - 1
src/vwebview.cpp

@@ -11,6 +11,7 @@
 #include <QApplication>
 #include <QImage>
 #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;
             }