vcl/inc/displayconnectiondispatch.hxx | 17 +++++++++++++---- vcl/inc/salinst.hxx | 10 ++++++---- vcl/inc/unx/salinst.h | 2 +- vcl/source/helper/displayconnectiondispatch.cxx | 18 +++++++++++------- vcl/unx/generic/app/salinst.cxx | 11 +++++++---- vcl/unx/generic/dtrans/X11_selection.hxx | 2 +- 6 files changed, 39 insertions(+), 21 deletions(-)
New commits: commit 836ea748caf2b9fb4b4729c3122668962bc448bf Author: Michael Weghorn <[email protected]> AuthorDate: Mon Mar 2 05:31:51 2026 +0100 Commit: Michael Weghorn <[email protected]> CommitDate: Mon Mar 2 17:19:20 2026 +0100 vcl: Have an abstract DisplayConnectionDispatch base class The existing DisplayConnectionDispatch class is only used by the gen/x11 vcl plugin, but currently the SalInstance base class used for all platforms/vcl plugins implements some logic for it. In preparation of moving that logic to X11SalInstance in a later commit, rename DisplayConnectionDispatch to X11DisplayConnectionDispatch (to make clear it's specific to the x11/gen vcl plugin) and reuse the existing DisplayConnectionDispatch name for a new abstract base class/interface. This one can in particular be continued to be used for ImplSVData::mxDisplayConnection in the future. (It's only actually used/set by the gen vcl plugin, but ImplSVMain() terminates it before calling DeInitVCL, so leaving it available there avoids having to rework the shutdown logic for now.) Change-Id: I32faa336aaef3ca30b71228b35a7be2c772171ca Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200759 Tested-by: Jenkins Reviewed-by: Michael Weghorn <[email protected]> diff --git a/vcl/inc/displayconnectiondispatch.hxx b/vcl/inc/displayconnectiondispatch.hxx index 43cfadd4250d..739291e03cd9 100644 --- a/vcl/inc/displayconnectiondispatch.hxx +++ b/vcl/inc/displayconnectiondispatch.hxx @@ -36,16 +36,25 @@ public: virtual void shutdown() noexcept = 0; }; -class VCL_DLLPUBLIC DisplayConnectionDispatch final : public cppu::OWeakObject +class VCL_DLLPUBLIC DisplayConnectionDispatch : public cppu::OWeakObject +{ +public: + DisplayConnectionDispatch(); + virtual ~DisplayConnectionDispatch(); + + virtual void terminate() = 0; +}; + +class VCL_DLLPUBLIC X11DisplayConnectionDispatch final : public DisplayConnectionDispatch { std::mutex m_aMutex; std::vector<rtl::Reference<DisplayEventHandler>> m_aHandlers; public: - DisplayConnectionDispatch(); - ~DisplayConnectionDispatch() override; + X11DisplayConnectionDispatch(); + ~X11DisplayConnectionDispatch() override; void start(); - void terminate(); + void terminate() override; bool dispatchEvent(const void* pEvent); diff --git a/vcl/inc/salinst.hxx b/vcl/inc/salinst.hxx index e91e48ea8da2..2ab9d7fef481 100644 --- a/vcl/inc/salinst.hxx +++ b/vcl/inc/salinst.hxx @@ -83,7 +83,7 @@ typedef struct _cairo_font_options cairo_font_options_t; class VCL_DLLPUBLIC SalInstance { private: - rtl::Reference< vcl::DisplayConnectionDispatch > m_pEventInst; + rtl::Reference<vcl::X11DisplayConnectionDispatch> m_pEventInst; const std::unique_ptr<comphelper::SolarMutex> m_pYieldMutex; css::uno::Reference<css::datatransfer::clipboard::XClipboard> m_clipboard; o3tl::sorted_vector<OUString> m_usedUI; @@ -193,10 +193,12 @@ public: CreateColorChooserDialog(weld::Window* pParent, vcl::ColorPickerMode eMode); virtual weld::Window* GetFrameWeld(const css::uno::Reference<css::awt::XWindow>& rWindow); - // methods for DisplayConnectionDispatch + // methods for X11DisplayConnectionDispatch - void SetEventCallback( rtl::Reference< vcl::DisplayConnectionDispatch > const & pInstance ) - { m_pEventInst = pInstance; } + void SetEventCallback(rtl::Reference<vcl::X11DisplayConnectionDispatch> const& pInstance) + { + m_pEventInst = pInstance; + } bool CallEventCallback(const void* pEvent); diff --git a/vcl/inc/unx/salinst.h b/vcl/inc/unx/salinst.h index e29a24c4552a..9fd33bd5b64d 100644 --- a/vcl/inc/unx/salinst.h +++ b/vcl/inc/unx/salinst.h @@ -88,7 +88,7 @@ public: virtual void AddToRecentDocumentList(const OUString& rFileUrl, const OUString& rMimeType, const OUString& rDocumentService) override; /** Get the DisplayConnection. It allows to send display events to the application. */ - static rtl::Reference<vcl::DisplayConnectionDispatch> GetDisplayConnection(); + static rtl::Reference<vcl::X11DisplayConnectionDispatch> GetDisplayConnection(); }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/helper/displayconnectiondispatch.cxx b/vcl/source/helper/displayconnectiondispatch.cxx index be050547a726..0b08259c6a5d 100644 --- a/vcl/source/helper/displayconnectiondispatch.cxx +++ b/vcl/source/helper/displayconnectiondispatch.cxx @@ -32,17 +32,20 @@ DisplayConnectionDispatch::DisplayConnectionDispatch() { } -DisplayConnectionDispatch::~DisplayConnectionDispatch() -{} +DisplayConnectionDispatch::~DisplayConnectionDispatch() {} -void DisplayConnectionDispatch::start() +X11DisplayConnectionDispatch::X11DisplayConnectionDispatch() {} + +X11DisplayConnectionDispatch::~X11DisplayConnectionDispatch() {} + +void X11DisplayConnectionDispatch::start() { DBG_TESTSOLARMUTEX(); ImplSVData* pSVData = ImplGetSVData(); pSVData->mpDefInst->SetEventCallback( this ); } -void DisplayConnectionDispatch::terminate() +void X11DisplayConnectionDispatch::terminate() { DBG_TESTSOLARMUTEX(); ImplSVData* pSVData = ImplGetSVData(); @@ -60,14 +63,15 @@ void DisplayConnectionDispatch::terminate() elem->shutdown(); } -void DisplayConnectionDispatch::addEventHandler(const rtl::Reference<DisplayEventHandler>& handler) +void X11DisplayConnectionDispatch::addEventHandler( + const rtl::Reference<DisplayEventHandler>& handler) { std::scoped_lock aGuard( m_aMutex ); m_aHandlers.push_back( handler ); } -void DisplayConnectionDispatch::removeEventHandler( +void X11DisplayConnectionDispatch::removeEventHandler( const rtl::Reference<DisplayEventHandler>& handler) { std::scoped_lock aGuard( m_aMutex ); @@ -75,7 +79,7 @@ void DisplayConnectionDispatch::removeEventHandler( std::erase(m_aHandlers, handler); } -bool DisplayConnectionDispatch::dispatchEvent(const void* pEvent) +bool X11DisplayConnectionDispatch::dispatchEvent(const void* pEvent) { SolarMutexReleaser aRel; diff --git a/vcl/unx/generic/app/salinst.cxx b/vcl/unx/generic/app/salinst.cxx index cc35c94cbf5f..d21a9295c619 100644 --- a/vcl/unx/generic/app/salinst.cxx +++ b/vcl/unx/generic/app/salinst.cxx @@ -228,17 +228,20 @@ std::shared_ptr<SalBitmap> X11SalInstance::CreateSalBitmap() return std::make_shared<SvpSalBitmap>(); } -rtl::Reference<vcl::DisplayConnectionDispatch> X11SalInstance::GetDisplayConnection() +rtl::Reference<vcl::X11DisplayConnectionDispatch> X11SalInstance::GetDisplayConnection() { ImplSVData* pSVData = ImplGetSVData(); if (!pSVData->mxDisplayConnection.is()) { - pSVData->mxDisplayConnection.set(new vcl::DisplayConnectionDispatch); - pSVData->mxDisplayConnection->start(); + rtl::Reference<vcl::X11DisplayConnectionDispatch> pDisplayConnection( + new vcl::X11DisplayConnectionDispatch); + pSVData->mxDisplayConnection = pDisplayConnection; + pDisplayConnection->start(); + return pDisplayConnection; } - return pSVData->mxDisplayConnection; + return dynamic_cast<vcl::X11DisplayConnectionDispatch*>(pSVData->mxDisplayConnection.get()); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/generic/dtrans/X11_selection.hxx b/vcl/unx/generic/dtrans/X11_selection.hxx index 3fcfdc97d224..60efc786aad6 100644 --- a/vcl/unx/generic/dtrans/X11_selection.hxx +++ b/vcl/unx/generic/dtrans/X11_selection.hxx @@ -214,7 +214,7 @@ namespace x11 { ::osl::Condition m_aDragRunning; ::Window m_aWindow; css::uno::Reference< css::frame::XDesktop2 > m_xDesktop; - rtl::Reference<vcl::DisplayConnectionDispatch> m_xDisplayConnection; + rtl::Reference<vcl::X11DisplayConnectionDispatch> m_xDisplayConnection; Time m_nSelectionTimestamp; // members used for Xdnd
