drop text_transfer_result and merge dnd and paste logic
Change-Id: Ia91e961d2d94bbd4baeb81647438a4026a4fce60
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117764
Tested-by: Caolán McNamara <caolanm@redhat.com>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/vcl/inc/unx/gtk/gtkinst.hxx b/vcl/inc/unx/gtk/gtkinst.hxx
index d7580cf..4c9eea3 100644
--- a/vcl/inc/unx/gtk/gtkinst.hxx
+++ b/vcl/inc/unx/gtk/gtkinst.hxx
@@ -56,12 +56,6 @@ class GtkSalFrame;
#if GTK_CHECK_VERSION(4, 0, 0)
gint gtk_dialog_run(GtkDialog *dialog);
struct text_transfer_result
{
OUString sText;
bool bDone = false;
};
struct read_transfer_result
{
enum { BlockSize = 8192 };
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 8fe127b..f3f7394 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -713,20 +713,6 @@ GdkClipboard* clipboard_get(SelectionType eSelection)
#if GTK_CHECK_VERSION(4, 0, 0)
void text_async_completed(GObject* source, GAsyncResult* res, gpointer data)
{
GdkClipboard* clipboard = GDK_CLIPBOARD(source);
text_transfer_result* pRes = static_cast<text_transfer_result*>(data);
gchar* pText = gdk_clipboard_read_text_finish(clipboard, res, nullptr);
pRes->sText = OUString(pText, pText ? strlen(pText) : 0, RTL_TEXTENCODING_UTF8);
g_free(pText);
pRes->bDone = true;
g_main_context_wakeup(nullptr);
}
void read_clipboard_async_completed(GObject* source, GAsyncResult* res, gpointer user_data)
{
GdkClipboard* clipboard = GDK_CLIPBOARD(source);
@@ -772,31 +758,43 @@ public:
virtual css::uno::Any SAL_CALL getTransferData(const css::datatransfer::DataFlavor& rFlavor) override
{
css::datatransfer::DataFlavor aFlavor(rFlavor);
if (aFlavor.MimeType == "text/plain;charset=utf-16")
aFlavor.MimeType = "text/plain;charset=utf-8";
auto it = m_aMimeTypeToGtkType.find(aFlavor.MimeType);
if (it == m_aMimeTypeToGtkType.end())
return css::uno::Any();
css::uno::Any aRet;
GdkClipboard* clipboard = clipboard_get(m_eSelection);
if (rFlavor.MimeType == "text/plain;charset=utf-16")
{
#if !GTK_CHECK_VERSION(4, 0, 0)
if (aFlavor.MimeType == "text/plain;charset=utf-8")
{
gchar *pText = gtk_clipboard_wait_for_text(clipboard);
OUString aStr(pText, pText ? strlen(pText) : 0, RTL_TEXTENCODING_UTF8);
g_free(pText);
aRet <<= aStr.replaceAll("\r\n", "\n");
#else
SalInstance* pInstance = GetSalData()->m_pInstance;
text_transfer_result aRes;
gdk_clipboard_read_text_async(clipboard, nullptr, text_async_completed, &aRes);
while (!aRes.bDone)
pInstance->DoYield(true, false);
aRet <<= aRes.sText.replaceAll("\r\n", "\n");
#endif
return aRet;
}
auto it = m_aMimeTypeToGtkType.find(rFlavor.MimeType);
if (it == m_aMimeTypeToGtkType.end())
return css::uno::Any();
#if GTK_CHECK_VERSION(4, 0, 0)
else
{
GtkSelectionData* data = gtk_clipboard_wait_for_contents(clipboard,
it->second);
if (!data)
{
return css::uno::Any();
}
gint length;
const guchar *rawdata = gtk_selection_data_get_data_with_length(data,
&length);
Sequence<sal_Int8> aSeq(reinterpret_cast<const sal_Int8*>(rawdata), length);
gtk_selection_data_free(data);
aRet <<= aSeq;
}
#else
SalInstance* pInstance = GetSalData()->m_pInstance;
read_transfer_result aRes;
const char *mime_types[] = { it->second.getStr(), nullptr };
@@ -811,21 +809,17 @@ public:
while (!aRes.bDone)
pInstance->DoYield(true, false);
Sequence<sal_Int8> aSeq(aRes.aVector.data(), aRes.aVector.size());
aRet <<= aSeq;
#else
GtkSelectionData* data = gtk_clipboard_wait_for_contents(clipboard,
it->second);
if (!data)
if (aFlavor.MimeType == "text/plain;charset=utf-8")
{
return css::uno::Any();
const char* pStr = reinterpret_cast<const char*>(aRes.aVector.data());
OUString aStr(pStr, aRes.aVector.size(), RTL_TEXTENCODING_UTF8);
aRet <<= aStr.replaceAll("\r\n", "\n");
}
gint length;
const guchar *rawdata = gtk_selection_data_get_data_with_length(data,
&length);
Sequence<sal_Int8> aSeq(reinterpret_cast<const sal_Int8*>(rawdata), length);
gtk_selection_data_free(data);
aRet <<= aSeq;
else
{
auto aSeq = css::uno::Sequence<sal_Int8>(aRes.aVector.data(), aRes.aVector.size());
aRet <<= aSeq;
}
#endif
return aRet;
}