tdf#142924 "toggled" is too late to use to populate changes to the menu
so use "state-flag-changed" on GTK_STATE_FLAG_CHECKED instead which
happens before "toggled"
Change-Id: I3a68212ce4bec2cda49d8bcaf3db864cb34013cc
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117441
Tested-by: Caolán McNamara <caolanm@redhat.com>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index f50d98a..3c4e313 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -8912,7 +8912,6 @@ class GtkInstanceToggleButton : public GtkInstanceButton, public virtual weld::T
{
protected:
GtkToggleButton* m_pToggleButton;
private:
gulong m_nToggledSignalId;
static void signalToggled(GtkToggleButton*, gpointer widget)
@@ -9472,6 +9471,17 @@ private:
}
#endif
#if !GTK_CHECK_VERSION(4, 0, 0)
static void signalFlagsChanged(GtkToggleButton* pToggleButton, GtkStateFlags flags, gpointer widget)
{
bool bOldChecked = flags & GTK_STATE_FLAG_CHECKED;
bool bNewChecked = gtk_widget_get_state_flags(GTK_WIDGET(pToggleButton)) & GTK_STATE_FLAG_CHECKED;
if (bOldChecked == bNewChecked)
return;
signalToggled(pToggleButton, widget);
}
#endif
public:
#if !GTK_CHECK_VERSION(4, 0, 0)
GtkInstanceMenuButton(GtkMenuButton* pMenuButton, GtkWidget* pMenuAlign, GtkInstanceBuilder* pBuilder, bool bTakeOwnership)
@@ -9494,6 +9504,14 @@ public:
#endif
{
#if !GTK_CHECK_VERSION(4, 0, 0)
// tdf#142924 "toggled" is to late to use to populate changes to the menu,
// so use "state-flag-changed" on GTK_STATE_FLAG_CHECKED instead which
// happens before "toggled"
g_signal_handler_disconnect(m_pToggleButton, m_nToggledSignalId);
m_nToggledSignalId = g_signal_connect(m_pToggleButton, "state-flags-changed", G_CALLBACK(signalFlagsChanged), this);
#endif
#if !GTK_CHECK_VERSION(4, 0, 0)
m_pLabel = gtk_bin_get_child(GTK_BIN(m_pMenuButton));
find_image(GTK_WIDGET(m_pMenuButton), &m_pImage);
m_pBox = formatMenuButton(m_pLabel);