[gtk+/gtk-3-16] GtkMenuButton: explicitly protect against recursion



commit a4b2626ecbf1a362a6ca4cfe0b66f5e547706847
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Jul 23 14:26:25 2015 +0200

    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

 gtk/gtkmenubutton.c |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkmenubutton.c b/gtk/gtkmenubutton.c
index 2126087..fad5cb6 100644
--- a/gtk/gtkmenubutton.c
+++ b/gtk/gtkmenubutton.c
@@ -133,6 +133,7 @@ struct _GtkMenuButtonPrivate
   GtkArrowType arrow_type;
   gboolean use_popover;
   guint press_handled : 1;
+  guint in_click : 1;
 };
 
 enum
@@ -429,6 +430,11 @@ gtk_menu_button_clicked (GtkButton *button)
   GtkMenuButtonPrivate *priv = menu_button->priv;
   gboolean active;
 
+  if (priv->in_click)
+    return;
+
+  priv->in_click = TRUE;
+
   if (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_toggled (GTK_TOGGLE_BUTTON (button));
+  priv->in_click = FALSE;
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]