diff options
author | Caolán McNamara <caolanm@redhat.com> | 2021-06-14 15:36:21 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2021-06-14 20:43:01 +0200 |
commit | 661e1cc00e4d53459d63a5db8a7142874c7efedd (patch) | |
tree | aebc77ff4c8cc69619e602af80af878f01fbe77e /vcl/unx | |
parent | e7d4f3c4dac6f48c87013b7196c1cd466502a350 (diff) |
gtk4: connect to underlying ToggleButton "toggle" of MenuButton
e.g. writer, tools, autotext, autotext menubutton
Change-Id: Ie29078eee4daff032421f8838ed2215101eb21e2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117171
Tested-by: Caolán McNamara <caolanm@redhat.com>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl/unx')
-rw-r--r-- | vcl/unx/gtk3/gtkinst.cxx | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 0ed8026b6ad2..a42ab5d3d24f 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -9201,6 +9201,7 @@ private: GtkImage* m_pImage; #else GtkPicture* m_pImage; + GtkToggleButton* m_pToggleButton; o3tl::sorted_vector<OString> m_aInsertedActions; // must outlive m_aActionEntries std::map<OString, OString> m_aIdToAction; std::vector<GActionEntry> m_aActionEntries; @@ -9216,20 +9217,30 @@ private: GtkWidget* m_pPopover; gulong m_nSignalId; #if GTK_CHECK_VERSION(4, 0, 0) + gulong m_nToggleSignalId; std::unique_ptr<vcl::Font> m_xFont; WidgetBackground m_aCustomBackground; #endif +#if GTK_CHECK_VERSION(4, 0, 0) + static void signalToggled(GtkToggleButton*, gpointer widget) + { + GtkInstanceMenuButton* pThis = static_cast<GtkInstanceMenuButton*>(widget); + SolarMutexGuard aGuard; + pThis->signal_toggled(); + } +#else static void signalToggled(GtkWidget*, gpointer widget) { GtkInstanceMenuButton* pThis = static_cast<GtkInstanceMenuButton*>(widget); SolarMutexGuard aGuard; pThis->toggle_menu(); } +#endif +#if !GTK_CHECK_VERSION(4, 0, 0) void toggle_menu() { -#if !GTK_CHECK_VERSION(4, 0, 0) if (!m_pMenuHack) return; if (!get_active()) @@ -9271,8 +9282,8 @@ private: // tdf#132540 keep the placeholder popover on this same side as the replacement menu gtk_popover_set_position(gtk_menu_button_get_popover(m_pMenuButton), ePosUsed); } -#endif } +#endif #if !GTK_CHECK_VERSION(4, 0, 0) static void signalGrabBroken(GtkWidget*, GdkEventGrabBroken *pEvent, gpointer widget) @@ -9499,7 +9510,9 @@ public: m_pBox = formatMenuButton(m_pLabel); #else GtkWidget* pToggleButton = gtk_widget_get_first_child(GTK_WIDGET(m_pMenuButton)); - assert(GTK_IS_BUTTON(pToggleButton)); + assert(GTK_IS_TOGGLE_BUTTON(pToggleButton)); + m_pToggleButton = GTK_TOGGLE_BUTTON(pToggleButton); + m_nToggleSignalId = g_signal_connect(m_pToggleButton, "toggled", G_CALLBACK(signalToggled), this); GtkWidget* pChild = gtk_button_get_child(GTK_BUTTON(pToggleButton)); m_pBox = GTK_IS_BOX(pChild) ? GTK_BOX(pChild) : nullptr; m_pLabel = m_pBox ? gtk_widget_get_first_child(GTK_WIDGET(m_pBox)) : nullptr; @@ -9934,17 +9947,33 @@ public: return pBox; } -#if !GTK_CHECK_VERSION(4, 0, 0) +#if GTK_CHECK_VERSION(4, 0, 0) + virtual void disable_notify_events() override + { + g_signal_handler_block(m_pToggleButton, m_nToggleSignalId); + GtkInstanceWidget::disable_notify_events(); + } + + virtual void enable_notify_events() override + { + GtkInstanceWidget::enable_notify_events(); + g_signal_handler_unblock(m_pToggleButton, m_nToggleSignalId); + } +#endif + virtual ~GtkInstanceMenuButton() override { +#if GTK_CHECK_VERSION(4, 0, 0) + g_signal_handler_disconnect(m_pToggleButton, m_nToggleSignalId); +#else if (m_pMenuHack) { g_signal_handler_disconnect(m_pMenuButton, m_nSignalId); gtk_menu_button_set_popover(m_pMenuButton, nullptr); gtk_widget_destroy(GTK_WIDGET(m_pMenuHack)); } - } #endif + } }; #if !GTK_CHECK_VERSION(4, 0, 0) |