[gtk+/gtk-3-16] GtkMenuButton: Avoid direct button access



commit f770957d6ac0380178cb038e4dddb7950db23680
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Jun 15 18:54:13 2015 -0400

    GtkMenuButton: Avoid direct button access
    
    We were getting ourselves in trouble by casting touch events
    to GdkEventButton and poking directly at their internals. Instead,
    use GdkEvent API to get what we need.
    
    This fixes a crash when using the gear menu in epiphany with
    touch. The same crash also occurred in testmenubutton.

 gtk/gtkmenubutton.c |   30 ++++++++++++++++++++++--------
 1 files changed, 22 insertions(+), 8 deletions(-)
---
diff --git a/gtk/gtkmenubutton.c b/gtk/gtkmenubutton.c
index 6ea53b2..80f1c55 100644
--- a/gtk/gtkmenubutton.c
+++ b/gtk/gtkmenubutton.c
@@ -372,11 +372,14 @@ menu_position_side_func (GtkMenu       *menu,
 }
 
 static void
-popup_menu (GtkMenuButton  *menu_button,
-            GdkEventButton *event)
+popup_menu (GtkMenuButton *menu_button,
+            GdkEvent      *event)
 {
   GtkMenuButtonPrivate *priv = menu_button->priv;
   GtkMenuPositionFunc func;
+  GdkDevice *device;
+  guint button;
+  guint32 time;
 
   if (priv->func)
     priv->func (priv->user_data);
@@ -395,14 +398,27 @@ popup_menu (GtkMenuButton  *menu_button,
         break;
   }
 
+  if (event)
+    {
+      device = gdk_event_get_device (event);
+      gdk_event_get_button (event, &button);
+      time = gdk_event_get_time (event);
+    }
+  else
+    {
+      device = NULL;
+      button = 0;
+      time = gtk_get_current_event_time ();
+    }
+
   gtk_menu_popup_for_device (GTK_MENU (priv->menu),
-                             event ? event->device : NULL,
+                             device,
                              NULL, NULL,
                              func,
                              GTK_WIDGET (menu_button),
                              NULL,
-                             event ? event->button : 0,
-                             event ? event->time : gtk_get_current_event_time ());
+                             button,
+                             time);
 }
 
 static void
@@ -418,9 +434,7 @@ gtk_menu_button_clicked (GtkButton *button)
 
       event = gtk_get_current_event ();
 
-      popup_menu (menu_button,
-                  (event && event->type != GDK_BUTTON_RELEASE) ?
-                  (GdkEventButton *) event : NULL);
+      popup_menu (menu_button, event);
 
       if (!event ||
           event->type == GDK_KEY_PRESS ||


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