GtkMenuButton: explicitly protect against recursion

The visibility toggling happening on ::click() relied implicitly
on the popover animation, but breaks on disabled animations. The
recursion happening within gtk_toggle_button_set_active() (which
triggers ::clicked when changing state) makes this vfunc to run
again, inverting the visibility of the popover in result.

Fix this by explicitly checking about recursion, we want the
button to be toggled to the right state, but we don't want the
callback running again.

https://bugzilla.gnome.org/show_bug.cgi?id=752577
This commit is contained in:
Carlos Garnacho 2015-07-23 14:26:25 +02:00 committed by Matthias Clasen
parent 2550c6a4db
commit 65f7fb04ad

View File

@ -133,6 +133,7 @@ struct _GtkMenuButtonPrivate
GtkArrowType arrow_type; GtkArrowType arrow_type;
gboolean use_popover; gboolean use_popover;
guint press_handled : 1; guint press_handled : 1;
guint in_click : 1;
}; };
enum enum
@ -429,6 +430,11 @@ gtk_menu_button_clicked (GtkButton *button)
GtkMenuButtonPrivate *priv = menu_button->priv; GtkMenuButtonPrivate *priv = menu_button->priv;
gboolean active; gboolean active;
if (priv->in_click)
return;
priv->in_click = TRUE;
if (priv->menu) if (priv->menu)
{ {
active = !gtk_widget_get_visible (priv->menu); active = !gtk_widget_get_visible (priv->menu);
@ -464,6 +470,7 @@ gtk_menu_button_clicked (GtkButton *button)
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), active); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), active);
gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (button)); gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (button));
priv->in_click = FALSE;
} }
static void static void