include/vcl/jsdialog/executor.hxx |    4 ++--
 include/vcl/weld.hxx              |   10 +++++-----
 vcl/qt5/QtInstanceDrawingArea.cxx |    2 +-
 vcl/source/app/salvtables.cxx     |    4 ++--
 vcl/unx/gtk3/gtkinst.cxx          |   23 +++++++++--------------
 5 files changed, 19 insertions(+), 24 deletions(-)

New commits:
commit 9eb63846be8b00d84624d0a367b2cdf46594ed59
Author:     Michael Weghorn <[email protected]>
AuthorDate: Wed Dec 10 23:08:21 2025 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Fri Dec 12 13:25:37 2025 +0100

    tdf#130857 weld: Move CommandEvent handling to weld::Widget base
    
    So far, both weld::IconView and weld::DrawingArea
    had a m_aCommandHdl member for handling/forwarding a
    CommandEvent and associated methods to set it.
    
    Unify/Deduplicate this in the weld::Widget base class.
    In a first step, simply move the existing members there
    and drop them in both subclasses.
    
    This by itself does not yet imply that connecting a handler
    to a different weld::Widget subclass will result in it getting
    called with a corresponding CommandEvent when e.g. right-clicking
    on that widget, because emitting such a CommandEventd is not yet
    implemented in any other subclasses, but that can now be added
    later as needed without duplicating the same logic in yet another
    subclass.
    
    Drop GtkInstanceIconView::signal_command, as it does the
    same as the new weld::Widget::signal_command now.
    
    Change-Id: I9367bdbb8be7994057667fab539aaf135751e063
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195414
    Reviewed-by: Michael Weghorn <[email protected]>
    Tested-by: Jenkins

diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index e4de142ba351..5789ea182236 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -86,6 +86,8 @@ class VCL_DLLPUBLIC Widget
 
     int m_nBlockNotify = 0;
 
+    Link<const CommandEvent&, bool> m_aCommandHdl;
+
 protected:
     Link<Widget&, void> m_aFocusInHdl;
     Link<Widget&, void> m_aFocusOutHdl;
@@ -102,6 +104,7 @@ protected:
     bool notify_events_disabled() const { return m_nBlockNotify != 0; }
     void enable_notify_events() { --m_nBlockNotify; }
 
+    bool signal_command(const CommandEvent& rCEvt) { return 
m_aCommandHdl.Call(rCEvt); }
     void signal_focus_in() { m_aFocusInHdl.Call(*this); }
     void signal_focus_out() { m_aFocusOutHdl.Call(*this); }
     bool signal_mnemonic_activate() { return 
m_aMnemonicActivateHdl.Call(*this); }
@@ -242,6 +245,8 @@ public:
 
     virtual void set_cursor_data(void* pData) = 0;
 
+    void connect_command(const Link<const CommandEvent&, bool>& rLink) { 
m_aCommandHdl = rLink; }
+
     virtual void connect_focus_in(const Link<Widget&, void>& rLink)
     {
         assert(!m_aFocusInHdl.IsSet() || !rLink.IsSet());
@@ -1648,7 +1653,6 @@ private:
 protected:
     Link<IconView&, void> m_aSelectionChangeHdl;
     Link<IconView&, bool> m_aItemActivatedHdl;
-    Link<const CommandEvent&, bool> m_aCommandHdl;
     Link<const TreeIter&, OUString> m_aQueryTooltipHdl;
     Link<const encoded_image_query&, bool> m_aGetPropertyTreeElemHdl;
 
@@ -1733,8 +1737,6 @@ public:
     */
     void connect_item_activated(const Link<IconView&, bool>& rLink) { 
m_aItemActivatedHdl = rLink; }
 
-    void connect_command(const Link<const CommandEvent&, bool>& rLink) { 
m_aCommandHdl = rLink; }
-
     virtual void connect_query_tooltip(const Link<const TreeIter&, OUString>& 
rLink)
     {
         m_aQueryTooltipHdl = rLink;
@@ -2892,9 +2894,6 @@ class VCL_DLLPUBLIC DrawingArea : virtual public Widget
 public:
     typedef std::pair<vcl::RenderContext&, const tools::Rectangle&> draw_args;
 
-private:
-    Link<const CommandEvent&, bool> m_aCommandHdl;
-
 protected:
     Link<draw_args, void> m_aDrawHdl;
     Link<Widget&, tools::Rectangle> m_aGetFocusRectHdl;
@@ -2906,8 +2905,6 @@ protected:
     // attempt to delete the range, return true if successful
     Link<const Selection&, bool> m_aDeleteSurroundingHdl;
 
-    bool signal_command(const CommandEvent& rCEvt) { return 
m_aCommandHdl.Call(rCEvt); }
-
     OUString signal_query_tooltip(tools::Rectangle& rHelpArea)
     {
         return m_aQueryTooltipHdl.Call(rHelpArea);
@@ -2927,7 +2924,6 @@ protected:
 
 public:
     void connect_draw(const Link<draw_args, void>& rLink) { m_aDrawHdl = 
rLink; }
-    void connect_command(const Link<const CommandEvent&, bool>& rLink) { 
m_aCommandHdl = rLink; }
     void connect_focus_rect(const Link<Widget&, tools::Rectangle>& rLink)
     {
         m_aGetFocusRectHdl = rLink;
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index e4fe0ce5fe88..451fca68738f 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -5629,7 +5629,7 @@ IMPL_LINK_NOARG(SalInstanceIconView, DoubleClickHdl, 
SvTreeListBox*, bool)
 
 IMPL_LINK(SalInstanceIconView, CommandHdl, const CommandEvent&, rEvent, bool)
 {
-    return m_aCommandHdl.Call(rEvent);
+    return signal_command(rEvent);
 }
 
 SalInstanceSpinButton::SalInstanceSpinButton(FormattedField* pButton, 
SalInstanceBuilder* pBuilder,
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 24ad64075759..ba1e5d2eabdf 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -16722,11 +16722,6 @@ private:
 
     DECL_LINK(async_signal_selection_changed, void*, void);
 
-    bool signal_command(const CommandEvent& rCEvt)
-    {
-        return m_aCommandHdl.Call(rCEvt);
-    }
-
     virtual bool signal_popup_menu(const CommandEvent& rCEvt) override
     {
         return signal_command(rCEvt);
commit 2d934a3f67687db5e7be68c85ad530a0d24744e6
Author:     Michael Weghorn <[email protected]>
AuthorDate: Wed Dec 10 22:34:42 2025 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Fri Dec 12 13:25:29 2025 +0100

    tdf#130857 weld: Introduce weld::DrawingArea::signal_command
    
    Instead of calling `m_aCommandHdl.Call` directly from the
    subclasses, introduce a new method that does this, as is
    done for other handlers.
    
    Rename the existing GtkInstanceDrawingArea::signal_command
    to GtkInstanceDrawingArea::signalCommand and let it call
    the new base class method.
    It is still needed as a public wrapper of the protected
    base class method because it gets called from outside
    of GtkInstanceDrawingArea itself.
    
    This also prepares for deduplicating the CommandEvent
    handling currently implemented in various weld::Widget
    subclasses (weld::DrawingArea, weld::TreeView,
    weld::IconView).
    
    Change-Id: Ic556298ca5e96f934afbd5a1f74c0ac0e4d03743
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195413
    Reviewed-by: Michael Weghorn <[email protected]>
    Tested-by: Jenkins

diff --git a/include/vcl/jsdialog/executor.hxx 
b/include/vcl/jsdialog/executor.hxx
index b421c4e7cc5b..949e081b89b2 100644
--- a/include/vcl/jsdialog/executor.hxx
+++ b/include/vcl/jsdialog/executor.hxx
@@ -135,9 +135,9 @@ public:
         rWidget.m_aKeyReleaseHdl.Call(rEvent);
     }
 
-    static void command(const weld::DrawingArea& rArea, const CommandEvent& 
rCmd)
+    static void command(weld::DrawingArea& rArea, const CommandEvent& rCmd)
     {
-        rArea.m_aCommandHdl.Call(rCmd);
+        rArea.signal_command(rCmd);
     }
 
     static void enter_page(const weld::Notebook& rNotebook, const OUString& 
rPage)
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index f41deb1e3248..e4de142ba351 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -2892,9 +2892,11 @@ class VCL_DLLPUBLIC DrawingArea : virtual public Widget
 public:
     typedef std::pair<vcl::RenderContext&, const tools::Rectangle&> draw_args;
 
+private:
+    Link<const CommandEvent&, bool> m_aCommandHdl;
+
 protected:
     Link<draw_args, void> m_aDrawHdl;
-    Link<const CommandEvent&, bool> m_aCommandHdl;
     Link<Widget&, tools::Rectangle> m_aGetFocusRectHdl;
     Link<tools::Rectangle&, OUString> m_aQueryTooltipHdl;
     // if handler returns true, drag is disallowed
@@ -2904,6 +2906,8 @@ protected:
     // attempt to delete the range, return true if successful
     Link<const Selection&, bool> m_aDeleteSurroundingHdl;
 
+    bool signal_command(const CommandEvent& rCEvt) { return 
m_aCommandHdl.Call(rCEvt); }
+
     OUString signal_query_tooltip(tools::Rectangle& rHelpArea)
     {
         return m_aQueryTooltipHdl.Call(rHelpArea);
diff --git a/vcl/qt5/QtInstanceDrawingArea.cxx 
b/vcl/qt5/QtInstanceDrawingArea.cxx
index 7c92d33b0847..b6b87d68a065 100644
--- a/vcl/qt5/QtInstanceDrawingArea.cxx
+++ b/vcl/qt5/QtInstanceDrawingArea.cxx
@@ -126,7 +126,7 @@ bool QtInstanceDrawingArea::eventFilter(QObject* pObject, 
QEvent* pEvent)
             QContextMenuEvent* pContextMenuEvent = 
static_cast<QContextMenuEvent*>(pEvent);
             const Point aPos = toPoint(pContextMenuEvent->pos());
             const CommandEvent aEvent(aPos, CommandEventId::ContextMenu);
-            if (m_aCommandHdl.Call(aEvent))
+            if (signal_command(aEvent))
                 return true;
             break;
         }
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index e575e5b777bc..e4fe0ce5fe88 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -6298,7 +6298,7 @@ IMPL_LINK_NOARG(SalInstanceDrawingArea, StyleUpdatedHdl, 
VclDrawingArea&, void)
 
 IMPL_LINK(SalInstanceDrawingArea, CommandHdl, const CommandEvent&, rEvent, 
bool)
 {
-    return m_aCommandHdl.Call(rEvent);
+    return signal_command(rEvent);
 }
 
 IMPL_LINK(SalInstanceDrawingArea, GetSurroundingHdl, OUString&, rSurrounding, 
int)
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index a6f8527eddc6..24ad64075759 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -18412,7 +18412,7 @@ private:
         CommandWheelData aWheelData(aEvt.mnDelta, aEvt.mnNotchDelta, 
aEvt.mnScrollLines,
                                     nMode, nCode, bHorz, aEvt.mbDeltaIsPixel);
         CommandEvent aCEvt(Point(aEvt.mnX, aEvt.mnY), CommandEventId::Wheel, 
true, &aWheelData);
-        return m_aCommandHdl.Call(aCEvt);
+        return signal_command(aCEvt);
     }
     static gboolean signalScroll(GtkWidget*, GdkEventScroll* pEvent, gpointer 
widget)
     {
@@ -18432,7 +18432,7 @@ private:
 
         CommandGestureZoomData aGestureData(x, y, eEventType, fScaleDelta);
         CommandEvent aCEvt(Point(x, y), CommandEventId::GestureZoom, true, 
&aGestureData);
-        return m_aCommandHdl.Call(aCEvt);
+        return signal_command(aCEvt);
     }
 
     static bool signalZoomBegin(GtkGesture* gesture, GdkEventSequence* 
sequence, gpointer widget)
@@ -18749,9 +18749,9 @@ public:
         return *m_xDevice;
     }
 
-    bool signal_command(const CommandEvent& rCEvt)
+    bool signalCommand(const CommandEvent& rCEvt)
     {
-        return m_aCommandHdl.Call(rCEvt);
+        return signal_command(rCEvt);
     }
 
     virtual void click(const Point& rPos) override
@@ -18853,7 +18853,7 @@ void IMHandler::updateIMSpotLocation()
 {
     CommandEvent aCEvt(Point(), CommandEventId::CursorPos);
     // we expect set_cursor_location to get triggered by this
-    m_pArea->signal_command(aCEvt);
+    m_pArea->signalCommand(aCEvt);
 }
 
 void IMHandler::set_cursor_location(const tools::Rectangle& rRect)
@@ -18875,7 +18875,7 @@ void IMHandler::signalIMCommit(GtkIMContext* 
/*pContext*/, gchar* pText, gpointe
     OUString sText(pText, strlen(pText), RTL_TEXTENCODING_UTF8);
     CommandExtTextInputData aData(sText, nullptr, sText.getLength(), 0, false);
     CommandEvent aCEvt(Point(), CommandEventId::ExtTextInput, false, &aData);
-    pThis->m_pArea->signal_command(aCEvt);
+    pThis->m_pArea->signalCommand(aCEvt);
 
     pThis->updateIMSpotLocation();
 
@@ -18904,7 +18904,7 @@ void IMHandler::signalIMPreeditChanged(GtkIMContext* 
pIMContext, gpointer im_han
 
     CommandExtTextInputData aData(sText, aInputFlags.data(), nCursorPos, 
nCursorFlags, false);
     CommandEvent aCEvt(Point(), CommandEventId::ExtTextInput, false, &aData);
-    pThis->m_pArea->signal_command(aCEvt);
+    pThis->m_pArea->signalCommand(aCEvt);
 
     pThis->updateIMSpotLocation();
 }
@@ -18952,7 +18952,7 @@ void IMHandler::StartExtTextInput()
     if (m_bExtTextInput)
         return;
     CommandEvent aCEvt(Point(), CommandEventId::StartExtTextInput);
-    m_pArea->signal_command(aCEvt);
+    m_pArea->signalCommand(aCEvt);
     m_bExtTextInput = true;
 }
 
@@ -18969,7 +18969,7 @@ void IMHandler::EndExtTextInput()
     if (!m_bExtTextInput)
         return;
     CommandEvent aCEvt(Point(), CommandEventId::EndExtTextInput);
-    m_pArea->signal_command(aCEvt);
+    m_pArea->signalCommand(aCEvt);
     m_bExtTextInput = false;
 }
 

Reply via email to