vcl/inc/unx/gtk/gtkinst.hxx | 10 +++++- vcl/unx/gtk3/gtkinst.cxx | 66 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 61 insertions(+), 15 deletions(-)
New commits: commit a7779c6dd428bb9997aaf3c43e6a4258223c751e Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Sat May 29 21:21:45 2021 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Sun May 30 16:05:40 2021 +0200 gtk4: inch towards providing clipboard content inheriting from GdkContentProvider and implementing a replacement get_value like gtk_text_buffer_content looks the way to go. Change-Id: Ic376a586b77b7f00385e5744c0bc2923f2a72c94 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116397 Tested-by: Caolán McNamara <caol...@redhat.com> Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/inc/unx/gtk/gtkinst.hxx b/vcl/inc/unx/gtk/gtkinst.hxx index 3202d87196ad..f389c6433b9c 100644 --- a/vcl/inc/unx/gtk/gtkinst.hxx +++ b/vcl/inc/unx/gtk/gtkinst.hxx @@ -57,17 +57,23 @@ class GtkSalFrame; gint gtk_dialog_run(GtkDialog *dialog); #endif -#if !GTK_CHECK_VERSION(4, 0, 0) struct VclToGtkHelper { std::vector<css::datatransfer::DataFlavor> aInfoToFlavor; +#if GTK_CHECK_VERSION(4, 0, 0) + std::vector<OString> FormatsToGtk(const css::uno::Sequence<css::datatransfer::DataFlavor> &rFormats); +#else std::vector<GtkTargetEntry> FormatsToGtk(const css::uno::Sequence<css::datatransfer::DataFlavor> &rFormats); +#endif +#if !GTK_CHECK_VERSION(4, 0, 0) void setSelectionData(const css::uno::Reference<css::datatransfer::XTransferable> &rTrans, GtkSelectionData *selection_data, guint info); +#endif private: +#if !GTK_CHECK_VERSION(4, 0, 0) GtkTargetEntry makeGtkTargetEntry(const css::datatransfer::DataFlavor& rFlavor); -}; #endif +}; class GtkTransferable : public cppu::WeakImplHelper<css::datatransfer::XTransferable> { diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 951468d66c20..a60f33790505 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -836,10 +836,12 @@ class VclGtkClipboard : Reference<css::datatransfer::XTransferable> m_aContents; Reference<css::datatransfer::clipboard::XClipboardOwner> m_aOwner; std::vector< Reference<css::datatransfer::clipboard::XClipboardListener> > m_aListeners; -#if !GTK_CHECK_VERSION(4, 0, 0) +#if GTK_CHECK_VERSION(4, 0, 0) + std::vector<OString> m_aGtkTargets; +#else std::vector<GtkTargetEntry> m_aGtkTargets; - VclToGtkHelper m_aConversionHelper; #endif + VclToGtkHelper m_aConversionHelper; DECL_LINK(AsyncSetGtkClipboard, void*, void); public: @@ -937,7 +939,6 @@ void VclGtkClipboard::ClipboardGet(GtkSelectionData *selection_data, guint info) } #endif -#if !GTK_CHECK_VERSION(4, 0, 0) namespace { const OString& getPID() @@ -956,6 +957,7 @@ namespace } } +#if !GTK_CHECK_VERSION(4, 0, 0) namespace { void ClipboardGetFunc(GdkClipboard* /*clipboard*/, GtkSelectionData *selection_data, @@ -1047,8 +1049,8 @@ void VclGtkClipboard::ClipboardClear() #if !GTK_CHECK_VERSION(4, 0, 0) for (auto &a : m_aGtkTargets) g_free(a.target); - m_aGtkTargets.clear(); #endif + m_aGtkTargets.clear(); } #if !GTK_CHECK_VERSION(4, 0, 0) @@ -1163,21 +1165,30 @@ VclGtkClipboard::~VclGtkClipboard() { GdkClipboard* clipboard = clipboard_get(m_eSelection); g_signal_handler_disconnect(clipboard, m_nOwnerChangedSignalId); -#if !GTK_CHECK_VERSION(4, 0, 0) if (!m_aGtkTargets.empty()) { +#if GTK_CHECK_VERSION(4, 0, 0) + gdk_clipboard_set_content(clipboard, nullptr); +#else gtk_clipboard_clear(clipboard); +#endif ClipboardClear(); } assert(!m_pSetClipboardEvent); assert(m_aGtkTargets.empty()); -#endif } -#if !GTK_CHECK_VERSION(4, 0, 0) +#if GTK_CHECK_VERSION(4, 0, 0) +std::vector<OString> VclToGtkHelper::FormatsToGtk(const css::uno::Sequence<css::datatransfer::DataFlavor> &rFormats) +#else std::vector<GtkTargetEntry> VclToGtkHelper::FormatsToGtk(const css::uno::Sequence<css::datatransfer::DataFlavor> &rFormats) +#endif { +#if GTK_CHECK_VERSION(4, 0, 0) + std::vector<OString> aGtkTargets; +#else std::vector<GtkTargetEntry> aGtkTargets; +#endif bool bHaveText(false), bHaveUTF8(false); for (const css::datatransfer::DataFlavor& rFlavor : rFormats) @@ -1192,28 +1203,42 @@ std::vector<GtkTargetEntry> VclToGtkHelper::FormatsToGtk(const css::uno::Sequenc bHaveUTF8 = true; } } +#if GTK_CHECK_VERSION(4, 0, 0) + aGtkTargets.push_back(OUStringToOString(rFlavor.MimeType, RTL_TEXTENCODING_UTF8)); +#else GtkTargetEntry aEntry(makeGtkTargetEntry(rFlavor)); aGtkTargets.push_back(aEntry); +#endif } if (bHaveText) { +#if !GTK_CHECK_VERSION(4, 0, 0) css::datatransfer::DataFlavor aFlavor; aFlavor.DataType = cppu::UnoType<Sequence< sal_Int8 >>::get(); +#endif if (!bHaveUTF8) { +#if GTK_CHECK_VERSION(4, 0, 0) + aGtkTargets.push_back("text/plain;charset=utf-8"); +#else aFlavor.MimeType = "text/plain;charset=utf-8"; aGtkTargets.push_back(makeGtkTargetEntry(aFlavor)); +#endif } +#if GTK_CHECK_VERSION(4, 0, 0) + aGtkTargets.push_back("UTF8_STRING"); + aGtkTargets.push_back("STRING"); +#else aFlavor.MimeType = "UTF8_STRING"; aGtkTargets.push_back(makeGtkTargetEntry(aFlavor)); aFlavor.MimeType = "STRING"; aGtkTargets.push_back(makeGtkTargetEntry(aFlavor)); +#endif } return aGtkTargets; } -#endif IMPL_LINK_NOARG(VclGtkClipboard, AsyncSetGtkClipboard, void*, void) { @@ -1235,8 +1260,14 @@ void VclGtkClipboard::SyncGtkClipboard() void VclGtkClipboard::SetGtkClipboard() { -#if !GTK_CHECK_VERSION(4, 0, 0) GdkClipboard* clipboard = clipboard_get(m_eSelection); +#if GTK_CHECK_VERSION(4, 0, 0) + GdkContentFormatsBuilder* pBuilder = gdk_content_formats_builder_new(); + for (const auto& rFormat : m_aGtkTargets) + gdk_content_formats_builder_add_mime_type(pBuilder, rFormat.getStr()); + GdkContentFormats* pFormats = gdk_content_formats_builder_free_to_formats(pBuilder); + //TODO pFormats needs a place to call home +#else gtk_clipboard_set_with_data(clipboard, m_aGtkTargets.data(), m_aGtkTargets.size(), ClipboardGetFunc, ClipboardClearFunc, this); gtk_clipboard_set_can_store(clipboard, m_aGtkTargets.data(), m_aGtkTargets.size()); @@ -1262,33 +1293,42 @@ void VclGtkClipboard::setContents( std::vector< Reference< datatransfer::clipboard::XClipboardListener > > aListeners( m_aListeners ); datatransfer::clipboard::ClipboardEvent aEv; -#if !GTK_CHECK_VERSION(4, 0, 0) GdkClipboard* clipboard = clipboard_get(m_eSelection); if (!m_aGtkTargets.empty()) { +#if GTK_CHECK_VERSION(4, 0, 0) + gdk_clipboard_set_content(clipboard, nullptr); +#else gtk_clipboard_clear(clipboard); +#endif ClipboardClear(); } assert(m_aGtkTargets.empty()); if (m_aContents.is()) { +#if GTK_CHECK_VERSION(4, 0, 0) + std::vector<OString> aGtkTargets(m_aConversionHelper.FormatsToGtk(aFormats)); +#else std::vector<GtkTargetEntry> aGtkTargets(m_aConversionHelper.FormatsToGtk(aFormats)); +#endif if (!aGtkTargets.empty()) { - GtkTargetEntry aEntry; OString sTunnel = "application/x-libreoffice-internal-id-" + getPID(); +#if GTK_CHECK_VERSION(4, 0, 0) + aGtkTargets.push_back(sTunnel); +#else + GtkTargetEntry aEntry; aEntry.target = g_strdup(sTunnel.getStr()); aEntry.flags = 0; aEntry.info = 0; aGtkTargets.push_back(aEntry); - +#endif m_aGtkTargets = aGtkTargets; if (!m_pSetClipboardEvent) m_pSetClipboardEvent = Application::PostUserEvent(LINK(this, VclGtkClipboard, AsyncSetGtkClipboard)); } } -#endif aEv.Contents = getContents(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits