vcl/inc/ClipboardBase.hxx | 11 ++++++++++- vcl/inc/qt5/QtClipboard.hxx | 3 +-- vcl/qt5/QtClipboard.cxx | 21 ++++----------------- vcl/qt5/QtInstance.cxx | 7 +++---- vcl/source/app/ClipboardBase.cxx | 17 ++++++++++++++++- vcl/unx/gtk3/gtkinst.cxx | 26 ++++++++------------------ 6 files changed, 42 insertions(+), 43 deletions(-)
New commits: commit fecda846c9a335c5e6431e7717f18d9a42926903 Author: Michael Weghorn <[email protected]> AuthorDate: Fri Feb 27 16:07:05 2026 +0100 Commit: Michael Weghorn <[email protected]> CommitDate: Sat Feb 28 09:25:33 2026 +0100 gtk/qt: Implement XClipboard::getName in base class Refactor a bit to let the ClipboardBase hold the ClipboardSelectionType and implement XClipboard::getName there, instead of having the logic in both, the gtk and qt specific implementations. Change-Id: I676f2406e420aacca24841805e7c59630d8f63e2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200643 Reviewed-by: Michael Weghorn <[email protected]> Tested-by: Jenkins diff --git a/vcl/inc/ClipboardBase.hxx b/vcl/inc/ClipboardBase.hxx index 6bfd66cacaca..9ce51d613bf7 100644 --- a/vcl/inc/ClipboardBase.hxx +++ b/vcl/inc/ClipboardBase.hxx @@ -9,6 +9,8 @@ #pragma once +#include "ClipboardSelectionType.hxx" + #include <com/sun/star/datatransfer/clipboard/XSystemClipboard.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> #include <cppuhelper/compbase.hxx> @@ -21,17 +23,24 @@ class VCL_DLLPUBLIC ClipboardBase : public cppu::WeakComponentImplHelper<css::datatransfer::clipboard::XSystemClipboard, css::lang::XServiceInfo> { + const ClipboardSelectionType m_eSelectionType; + protected: osl::Mutex m_aMutex; - ClipboardBase(); + explicit ClipboardBase(ClipboardSelectionType eSelectionType); virtual ~ClipboardBase() override; + ClipboardSelectionType GetSelectionType() { return m_eSelectionType; } + public: // XServiceInfo virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override; virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; + // XClipboard + virtual OUString SAL_CALL getName() override; + // XClipboardEx virtual sal_Int8 SAL_CALL getRenderingCapabilities() override; }; diff --git a/vcl/inc/qt5/QtClipboard.hxx b/vcl/inc/qt5/QtClipboard.hxx index c4331e0bf1b9..51c4045a680c 100644 --- a/vcl/inc/qt5/QtClipboard.hxx +++ b/vcl/inc/qt5/QtClipboard.hxx @@ -59,7 +59,7 @@ signals: void clearClipboard(); public: - explicit QtClipboard(const QClipboard::Mode eMode); + explicit QtClipboard(ClipboardSelectionType eSelection); static bool isSupported(const QClipboard::Mode eMode); @@ -72,7 +72,6 @@ public: const css::uno::Reference<css::datatransfer::XTransferable>& xTrans, const css::uno::Reference<css::datatransfer::clipboard::XClipboardOwner>& xClipboardOwner) override; - virtual OUString SAL_CALL getName() override; // XFlushableClipboard virtual void SAL_CALL flushClipboard() override; diff --git a/vcl/qt5/QtClipboard.cxx b/vcl/qt5/QtClipboard.cxx index 85aecf496129..dac6e4d57cba 100644 --- a/vcl/qt5/QtClipboard.cxx +++ b/vcl/qt5/QtClipboard.cxx @@ -17,6 +17,7 @@ #include <QtWidgets/QApplication> #include <QtInstance.hxx> +#include <QtTools.hxx> #include <QtTransferable.hxx> #include <cassert> @@ -29,9 +30,9 @@ #include <emscripten.h> #endif -QtClipboard::QtClipboard(const QClipboard::Mode eMode) - : ImplInheritanceHelper() - , m_eClipboardMode(eMode) +QtClipboard::QtClipboard(ClipboardSelectionType eSelectionType) + : ImplInheritanceHelper(eSelectionType) + , m_eClipboardMode(toQClipboardMode(eSelectionType)) , m_bOwnClipboardChange(false) , m_bDoClear(false) { @@ -234,20 +235,6 @@ OUString QtClipboard::getImplementationName() return u"com.sun.star.datatransfer.QtClipboard"_ustr; } -OUString QtClipboard::getName() -{ - switch (m_eClipboardMode) - { - case QClipboard::Clipboard: - return u"CLIPBOARD"_ustr; - case QClipboard::Selection: - return u"PRIMARY"_ustr; - default: - assert(false && "unexpected clipboard mode"); - return OUString(); - } -} - void QtClipboard::addClipboardListener( const css::uno::Reference<css::datatransfer::clipboard::XClipboardListener>& listener) { diff --git a/vcl/qt5/QtInstance.cxx b/vcl/qt5/QtInstance.cxx index 82a46a256227..5c70ff8feedd 100644 --- a/vcl/qt5/QtInstance.cxx +++ b/vcl/qt5/QtInstance.cxx @@ -660,10 +660,9 @@ QtInstance::CreateClipboard(ClipboardSelectionType eSelection) rtl::Reference<QtClipboard> pClipboard = EmscriptenLightweightRunInMainThread([&eSelection] { assert(QApplication::clipboard()->thread() == qApp->thread()); - const QClipboard::Mode eClipboardMode = toQClipboardMode(eSelection); - if (QtClipboard::isSupported(eClipboardMode)) - return rtl::Reference<QtClipboard>(new QtClipboard(eClipboardMode)); - SAL_WARN("vcl.qt", "Ignoring unsupported clipboard mode: '" << eClipboardMode << "'"); + if (QtClipboard::isSupported(toQClipboardMode(eSelection))) + return rtl::Reference<QtClipboard>(new QtClipboard(eSelection)); + SAL_WARN("vcl.qt", "Ignoring unsupported selection type"); return rtl::Reference<QtClipboard>(); }); if (pClipboard.is()) diff --git a/vcl/source/app/ClipboardBase.cxx b/vcl/source/app/ClipboardBase.cxx index 636d88962e72..f5797c9e20dd 100644 --- a/vcl/source/app/ClipboardBase.cxx +++ b/vcl/source/app/ClipboardBase.cxx @@ -11,9 +11,10 @@ #include <cppuhelper/supportsservice.hxx> -ClipboardBase::ClipboardBase() +ClipboardBase::ClipboardBase(ClipboardSelectionType eSelectionType) : cppu::WeakComponentImplHelper<css::datatransfer::clipboard::XSystemClipboard, css::lang::XServiceInfo>(m_aMutex) + , m_eSelectionType(eSelectionType) { } @@ -29,6 +30,20 @@ sal_Bool ClipboardBase::supportsService(const OUString& ServiceName) return cppu::supportsService(this, ServiceName); } +OUString ClipboardBase::getName() +{ + switch (m_eSelectionType) + { + case ClipboardSelectionType::Clipboard: + return u"CLIPBOARD"_ustr; + case ClipboardSelectionType::Primary: + return u"PRIMARY"_ustr; + default: + assert(false && "unhandled clipboard selection type"); + return OUString(); + } +} + sal_Int8 ClipboardBase::getRenderingCapabilities() { return 0; } /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 6a0f894bd454..0a6cbb6c580c 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -950,7 +950,6 @@ class VclGtkClipboard : public cppu::ImplInheritanceHelper<ClipboardBase, datatransfer::clipboard::XFlushableClipboard> { - ClipboardSelectionType m_eSelection; gulong m_nOwnerChangedSignalId; ImplSVEvent* m_pSetClipboardEvent; Reference<css::datatransfer::XTransferable> m_aContents; @@ -989,8 +988,6 @@ public: const Reference< css::datatransfer::XTransferable >& xTrans, const Reference< css::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner ) override; - virtual OUString SAL_CALL getName() override; - /* * XFlushableClipboard */ @@ -1027,7 +1024,7 @@ Reference< css::datatransfer::XTransferable > VclGtkClipboard::getContents() { //tdf#93887 This is the system clipboard/selection. We fetch it when we are not //the owner of the clipboard and have not already fetched it. - m_aContents = new GtkClipboardTransferable(m_eSelection); + m_aContents = new GtkClipboardTransferable(GetSelectionType()); #if GTK_CHECK_VERSION(4, 0, 0) if (m_pClipboardContent) transerable_content_set_transferable(m_pClipboardContent, m_aContents.get()); @@ -1367,14 +1364,13 @@ void VclToGtkHelper::setSelectionData(const Reference<css::datatransfer::XTransf #endif VclGtkClipboard::VclGtkClipboard(ClipboardSelectionType eSelection) - : ImplInheritanceHelper() - , m_eSelection(eSelection) + : ImplInheritanceHelper(eSelection) , m_pSetClipboardEvent(nullptr) #if GTK_CHECK_VERSION(4, 0, 0) , m_pClipboardContent(nullptr) #endif { - GdkClipboard* clipboard = clipboard_get(m_eSelection); + GdkClipboard* clipboard = clipboard_get(GetSelectionType()); #if GTK_CHECK_VERSION(4, 0, 0) m_nOwnerChangedSignalId = g_signal_connect(clipboard, "changed", G_CALLBACK(handle_owner_change), this); @@ -1389,17 +1385,17 @@ void VclGtkClipboard::flushClipboard() #if !GTK_CHECK_VERSION(4, 0, 0) SolarMutexGuard aGuard; - if (m_eSelection != ClipboardSelectionType::Clipboard) + if (GetSelectionType() != ClipboardSelectionType::Clipboard) return; - GdkClipboard* clipboard = clipboard_get(m_eSelection); + GdkClipboard* clipboard = clipboard_get(GetSelectionType()); gtk_clipboard_store(clipboard); #endif } VclGtkClipboard::~VclGtkClipboard() { - GdkClipboard* clipboard = clipboard_get(m_eSelection); + GdkClipboard* clipboard = clipboard_get(GetSelectionType()); g_signal_handler_disconnect(clipboard, m_nOwnerChangedSignalId); if (!m_aGtkTargets.empty()) { @@ -1481,7 +1477,7 @@ void VclGtkClipboard::SyncGtkClipboard() void VclGtkClipboard::SetGtkClipboard() { - GdkClipboard* clipboard = clipboard_get(m_eSelection); + GdkClipboard* clipboard = clipboard_get(GetSelectionType()); #if GTK_CHECK_VERSION(4, 0, 0) m_pClipboardContent = TRANSFERABLE_CONTENT(transerable_content_new(&m_aConversionHelper, m_aContents.get())); transerable_content_set_detach_clipboard_link(m_pClipboardContent, LINK(this, VclGtkClipboard, DetachClipboard)); @@ -1516,7 +1512,7 @@ void VclGtkClipboard::setContents( std::vector< Reference< datatransfer::clipboard::XClipboardListener > > aListeners( m_aListeners ); datatransfer::clipboard::ClipboardEvent aEv; - GdkClipboard* clipboard = clipboard_get(m_eSelection); + GdkClipboard* clipboard = clipboard_get(GetSelectionType()); if (!m_aGtkTargets.empty()) { #if GTK_CHECK_VERSION(4, 0, 0) @@ -1564,12 +1560,6 @@ void VclGtkClipboard::setContents( } } -OUString VclGtkClipboard::getName() -{ - return (m_eSelection == ClipboardSelectionType::Clipboard) ? u"CLIPBOARD"_ustr - : u"PRIMARY"_ustr; -} - void VclGtkClipboard::addClipboardListener( const Reference< datatransfer::clipboard::XClipboardListener >& listener ) { osl::Guard aGuard( m_aMutex );
