[gtk+] GtkMenuButton: Avoid direct button access
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] GtkMenuButton: Avoid direct button access
- Date: Mon, 15 Jun 2015 22:55:50 +0000 (UTC)
commit f99375f91ed3e785d2e2bb0bb398f84202f71fed
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]