diff options
author | Caolán McNamara <caolanm@redhat.com> | 2021-05-29 21:21:45 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2021-05-30 16:05:40 +0200 |
commit | a7779c6dd428bb9997aaf3c43e6a4258223c751e (patch) | |
tree | 9c49a899a87e66ec3e2d4f08a523664782e20817 /vcl/unx | |
parent | f781691a6e35923acf64e11e082c4173fcf9d5e6 (diff) |
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 <caolanm@redhat.com>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl/unx')
-rw-r--r-- | vcl/unx/gtk3/gtkinst.cxx | 66 |
1 files changed, 53 insertions, 13 deletions
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(); |