diff options
author | Matthias Clasen <mclasen@redhat.com> | 2015-06-15 18:54:13 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2015-06-15 18:54:13 -0400 |
commit | f99375f91ed3e785d2e2bb0bb398f84202f71fed (patch) | |
tree | 74f871b73b14e8d8782ad08752c6f88a000f5e24 /gtk/gtkmenubutton.c | |
parent | 9fc19b5a26e34568c46b90f7cb7357a2898e78b0 (diff) | |
download | gtk+-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.c | 30 |
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 || |