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

Reply via email to