forked from AuroraMiddleware/gtk
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:
parent
2550c6a4db
commit
65f7fb04ad
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user