From: Carlos Garnacho Date: Mon, 12 Dec 2011 19:07:57 +0000 (+0100) Subject: menus: Don't popdown submenus on button release for touch devices X-Git-Url: http://pileus.org/git/?p=~andy%2Fgtk;a=commitdiff_plain;h=535b4150fdbad94f937e709923f3567f17490b76 menus: Don't popdown submenus on button release for touch devices This is so submenus stay open as the parent menu item is pressed/released, since the user would typically lift the finger in order to select a submenu item. --- diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c index 837c201a1..8ecf9bf05 100644 --- a/gtk/gtkmenu.c +++ b/gtk/gtkmenu.c @@ -3358,9 +3358,17 @@ static gboolean gtk_menu_button_press (GtkWidget *widget, GdkEventButton *event) { + GdkDevice *source_device; + GtkWidget *event_widget; + GtkMenu *menu; + if (event->type != GDK_BUTTON_PRESS) return FALSE; + source_device = gdk_event_get_source_device ((GdkEvent *) event); + event_widget = gtk_get_event_widget ((GdkEvent *) event); + menu = GTK_MENU (widget); + /* Don't pass down to menu shell if a non-menuitem part of the menu * was clicked. The check for the event_widget being a GtkMenuShell * works because we have the pointer grabbed on menu_shell->window @@ -3368,10 +3376,16 @@ gtk_menu_button_press (GtkWidget *widget, * the menu or on its border are delivered relative to * menu_shell->window. */ - if (GTK_IS_MENU_SHELL (gtk_get_event_widget ((GdkEvent *) event)) && + if (GTK_IS_MENU_SHELL (event_widget) && pointer_in_menu_window (widget, event->x_root, event->y_root)) return TRUE; + if (GTK_IS_MENU_ITEM (event_widget) && + gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHSCREEN && + GTK_MENU_ITEM (event_widget)->priv->submenu != NULL && + !gtk_widget_is_drawable (GTK_MENU_ITEM (event_widget)->priv->submenu)) + menu->priv->ignore_button_release = TRUE; + return GTK_WIDGET_CLASS (gtk_menu_parent_class)->button_press_event (widget, event); } diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c index 147430bbb..3d70ed6f9 100644 --- a/gtk/gtkmenuitem.c +++ b/gtk/gtkmenuitem.c @@ -1700,7 +1700,7 @@ gtk_real_menu_item_select (GtkMenuItem *menu_item) } if ((!source_device || - gdk_device_get_source (source_device) != GDK_SOURCE_TOUCH) && + gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHSCREEN) && priv->submenu && (!gtk_widget_get_mapped (priv->submenu) || GTK_MENU (priv->submenu)->priv->tearoff_active))