]> Pileus Git - ~andy/gtk/commitdiff
menus: Don't popdown submenus on button release for touch devices
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 12 Dec 2011 19:07:57 +0000 (20:07 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 1 Mar 2012 21:25:24 +0000 (16:25 -0500)
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.

gtk/gtkmenu.c
gtk/gtkmenuitem.c

index 837c201a1cf70e499e320feb0d362e39df8a1592..8ecf9bf05d9625d452f542659f0d775b5909aa51 100644 (file)
@@ -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);
 }
 
index 147430bbb63290b1745a1dd2fba4303deb3f1061..3d70ed6f9210bc825f3245fac21378d99936d411 100644 (file)
@@ -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))