[gtk+/gtk-3-16] GtkMenuButton: Avoid direct button access
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/gtk-3-16] GtkMenuButton: Avoid direct button access
- Date: Tue, 7 Jul 2015 14:33:12 +0000 (UTC)
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]