summaryrefslogtreecommitdiff
path: root/vcl/unx
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-06-14 15:36:21 +0100
committerCaolán McNamara <caolanm@redhat.com>2021-06-14 20:43:01 +0200
commit661e1cc00e4d53459d63a5db8a7142874c7efedd (patch)
treeaebc77ff4c8cc69619e602af80af878f01fbe77e /vcl/unx
parente7d4f3c4dac6f48c87013b7196c1cd466502a350 (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.cxx39
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)