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; }
