summaryrefslogtreecommitdiff
path: root/gtk/gtkmenubutton.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2015-06-15 18:54:13 -0400
committerMatthias Clasen <mclasen@redhat.com>2015-06-15 18:54:13 -0400
commitf99375f91ed3e785d2e2bb0bb398f84202f71fed (patch)
tree74f871b73b14e8d8782ad08752c6f88a000f5e24 /gtk/gtkmenubutton.c
parent9fc19b5a26e34568c46b90f7cb7357a2898e78b0 (diff)
downloadgtk+-f99375f91ed3e785d2e2bb0bb398f84202f71fed.tar.gz
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.
Diffstat (limited to 'gtk/gtkmenubutton.c')
-rw-r--r--gtk/gtkmenubutton.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/gtk/gtkmenubutton.c b/gtk/gtkmenubutton.c
index 6ea53b2f1d..80f1c55d6a 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 ||