Skip to content

Commit

Permalink
GtkMenuButton: Avoid direct button access
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Matthias Clasen committed Jun 15, 2015
1 parent 9fc19b5 commit f99375f
Showing 1 changed file with 22 additions and 8 deletions.
30 changes: 22 additions & 8 deletions gtk/gtkmenubutton.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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
Expand All @@ -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 ||
Expand Down

0 comments on commit f99375f

Please sign in to comment.