[Libreoffice-commits] core.git: vcl/inc vcl/unx

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Thu Jun 24 19:41:22 UTC 2021


 vcl/inc/unx/gtk/gtkinst.hxx |    2 +
 vcl/unx/gtk3/gtkframe.cxx   |   33 -------------------
 vcl/unx/gtk3/gtkinst.cxx    |   76 ++++++++++++++++++++++++++++++--------------
 3 files changed, 56 insertions(+), 55 deletions(-)

New commits:
commit dcecb57d94fa1d4dc0b9f2449974936a40e6ba7d
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Thu Jun 24 09:00:04 2021 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Thu Jun 24 21:40:32 2021 +0200

    gtk4: reuse read_block_async_completed from dnd for cnp
    
    Change-Id: I1acfa4c48ee59fd79b4a4b32afa732feef6348c7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117761
    Tested-by: Caolán McNamara <caolanm at redhat.com>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/inc/unx/gtk/gtkinst.hxx b/vcl/inc/unx/gtk/gtkinst.hxx
index 141a2a209ab0..d7580cf68b1e 100644
--- a/vcl/inc/unx/gtk/gtkinst.hxx
+++ b/vcl/inc/unx/gtk/gtkinst.hxx
@@ -69,6 +69,8 @@ struct read_transfer_result
     bool bDone = false;
 
     std::vector<sal_Int8> aVector;
+
+    static void read_block_async_completed(GObject* source, GAsyncResult* res, gpointer user_data);
 };
 
 #endif
diff --git a/vcl/unx/gtk3/gtkframe.cxx b/vcl/unx/gtk3/gtkframe.cxx
index ffc934687344..3f13023d76f4 100644
--- a/vcl/unx/gtk3/gtkframe.cxx
+++ b/vcl/unx/gtk3/gtkframe.cxx
@@ -4225,37 +4225,6 @@ namespace {
 
 #if GTK_CHECK_VERSION(4, 0, 0)
 
-void read_async_completed(GObject* source, GAsyncResult* res, gpointer user_data)
-{
-    GInputStream* stream = G_INPUT_STREAM(source);
-    read_transfer_result* pRes = static_cast<read_transfer_result*>(user_data);
-
-    gsize bytes_read = g_input_stream_read_finish(stream, res, nullptr);
-
-    bool bFinished = bytes_read == 0;
-
-    if (bFinished)
-    {
-        g_object_unref(stream);
-        pRes->aVector.resize(pRes->nRead);
-        pRes->bDone = true;
-        g_main_context_wakeup(nullptr);
-        return;
-    }
-
-    pRes->nRead += bytes_read;
-
-    pRes->aVector.resize(pRes->nRead + read_transfer_result::BlockSize);
-
-    g_input_stream_read_async(stream,
-                              pRes->aVector.data() + pRes->nRead,
-                              read_transfer_result::BlockSize,
-                              G_PRIORITY_DEFAULT,
-                              nullptr,
-                              read_async_completed,
-                              user_data);
-}
-
 void read_drop_async_completed(GObject* source, GAsyncResult* res, gpointer user_data)
 {
     GdkDrop* drop = GDK_DROP(source);
@@ -4277,7 +4246,7 @@ void read_drop_async_completed(GObject* source, GAsyncResult* res, gpointer user
                               pRes->aVector.size(),
                               G_PRIORITY_DEFAULT,
                               nullptr,
-                              read_async_completed,
+                              read_transfer_result::read_block_async_completed,
                               user_data);
 }
 #endif
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 92df2f48d516..8fe127b32e79 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -665,6 +665,39 @@ sal_Bool SAL_CALL GtkTransferable::isDataFlavorSupported(const css::datatransfer
     return std::any_of(aAll.begin(), aAll.end(), DataFlavorEq(rFlavor));
 }
 
+#if GTK_CHECK_VERSION(4, 0, 0)
+void read_transfer_result::read_block_async_completed(GObject* source, GAsyncResult* res, gpointer user_data)
+{
+    GInputStream* stream = G_INPUT_STREAM(source);
+    read_transfer_result* pRes = static_cast<read_transfer_result*>(user_data);
+
+    gsize bytes_read = g_input_stream_read_finish(stream, res, nullptr);
+
+    bool bFinished = bytes_read == 0;
+
+    if (bFinished)
+    {
+        g_object_unref(stream);
+        pRes->aVector.resize(pRes->nRead);
+        pRes->bDone = true;
+        g_main_context_wakeup(nullptr);
+        return;
+    }
+
+    pRes->nRead += bytes_read;
+
+    pRes->aVector.resize(pRes->nRead + read_transfer_result::BlockSize);
+
+    g_input_stream_read_async(stream,
+                              pRes->aVector.data() + pRes->nRead,
+                              read_transfer_result::BlockSize,
+                              G_PRIORITY_DEFAULT,
+                              nullptr,
+                              read_block_async_completed,
+                              user_data);
+}
+#endif
+
 namespace {
 
 GdkClipboard* clipboard_get(SelectionType eSelection)
@@ -694,35 +727,29 @@ void text_async_completed(GObject* source, GAsyncResult* res, gpointer data)
     g_main_context_wakeup(nullptr);
 }
 
-void read_async_completed(GObject* source, GAsyncResult* res, gpointer data)
+void read_clipboard_async_completed(GObject* source, GAsyncResult* res, gpointer user_data)
 {
     GdkClipboard* clipboard = GDK_CLIPBOARD(source);
-    read_transfer_result* pRes = static_cast<read_transfer_result*>(data);
+    read_transfer_result* pRes = static_cast<read_transfer_result*>(user_data);
 
-    if (GInputStream* pResult = gdk_clipboard_read_finish(clipboard, res, nullptr, nullptr))
-    {
-        const int nBlockSize = 8192;
-        std::vector<sal_Int8> aVector(nBlockSize);
-        gsize total = 0;
-
-        while (true)
-        {
-            gsize bytes_read;
-            if (!g_input_stream_read_all(pResult, aVector.data() + total, nBlockSize, &bytes_read, nullptr, nullptr))
-                break;
-            total += bytes_read;
-            if (bytes_read < nBlockSize)
-                break;
-            aVector.resize(aVector.size() + nBlockSize);
-        }
+    GInputStream* pResult = gdk_clipboard_read_finish(clipboard, res, nullptr, nullptr);
 
-        pRes->aVector.resize(total);
-        g_object_unref(pResult);
+    if (!pResult)
+    {
+        pRes->bDone = true;
+        g_main_context_wakeup(nullptr);
+        return;
     }
 
-    pRes->bDone = true;
+    pRes->aVector.resize(read_transfer_result::BlockSize);
 
-    g_main_context_wakeup(nullptr);
+    g_input_stream_read_async(pResult,
+                              pRes->aVector.data(),
+                              pRes->aVector.size(),
+                              G_PRIORITY_DEFAULT,
+                              nullptr,
+                              read_transfer_result::read_block_async_completed,
+                              user_data);
 }
 
 #endif
@@ -773,14 +800,17 @@ public:
         SalInstance* pInstance = GetSalData()->m_pInstance;
         read_transfer_result aRes;
         const char *mime_types[] = { it->second.getStr(), nullptr };
+
         gdk_clipboard_read_async(clipboard,
                                  mime_types,
                                  G_PRIORITY_DEFAULT,
                                  nullptr,
-                                 read_async_completed,
+                                 read_clipboard_async_completed,
                                  &aRes);
+
         while (!aRes.bDone)
             pInstance->DoYield(true, false);
+
         Sequence<sal_Int8> aSeq(aRes.aVector.data(), aRes.aVector.size());
         aRet <<= aSeq;
 #else


More information about the Libreoffice-commits mailing list