diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c
index 4fe6973..868d6ce 100644
--- a/gtk/gtkmenu.c
+++ b/gtk/gtkmenu.c
@@ -1688,7 +1688,9 @@ gtk_menu_popup_for_device (GtkMenu             *menu,
 
   /* if no item is selected, select the first one */
   if (!menu_shell->priv->active_menu_item &&
-      source_device && gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHSCREEN)
+      source_device &&
+      (gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHSCREEN ||
+       gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHPAD))
     gtk_menu_shell_select_first (menu_shell, TRUE);
 
   /* Once everything is set up correctly, map the toplevel */
@@ -3383,7 +3385,8 @@ gtk_menu_button_press (GtkWidget      *widget,
     return TRUE;
 
   if (GTK_IS_MENU_ITEM (event_widget) &&
-      gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHSCREEN &&
+      (gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHSCREEN ||
+       gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHPAD) &&
       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;
@@ -3656,7 +3659,8 @@ gtk_menu_motion_notify (GtkWidget      *widget,
   source_device = gdk_event_get_source_device ((GdkEvent *) event);
 
   if (GTK_IS_MENU (widget) &&
-      gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHSCREEN)
+      gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHSCREEN &&
+      gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHPAD)
     {
       GtkMenuPrivate *priv = GTK_MENU(widget)->priv;
 
@@ -4127,7 +4131,8 @@ gtk_menu_enter_notify (GtkWidget        *widget,
   menu_item = gtk_get_event_widget ((GdkEvent*) event);
 
   if (GTK_IS_MENU (widget) &&
-      gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHSCREEN)
+      gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHSCREEN &&
+      gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHPAD)
     {
       GtkMenuShell *menu_shell = GTK_MENU_SHELL (widget);
 
@@ -4137,6 +4142,7 @@ gtk_menu_enter_notify (GtkWidget        *widget,
     }
 
   if (gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHSCREEN &&
+      gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHPAD &&
       GTK_IS_MENU_ITEM (menu_item))
     {
       GtkWidget *menu = gtk_widget_get_parent (menu_item);
@@ -4209,7 +4215,8 @@ gtk_menu_leave_notify (GtkWidget        *widget,
 
   source_device = gdk_event_get_source_device ((GdkEvent *) event);
 
-  if (gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHSCREEN)
+  if (gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHSCREEN &&
+      gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHPAD)
     gtk_menu_handle_scrolling (menu, event->x_root, event->y_root, FALSE, TRUE);
 
   event_widget = gtk_get_event_widget ((GdkEvent*) event);
@@ -4291,7 +4298,8 @@ gtk_menu_captured_event (GtkWidget *widget,
     case GDK_TOUCH_BEGIN:
     case GDK_BUTTON_PRESS:
       if ((!gdk_event_get_button (event, &button) || button == 1) &&
-          gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHSCREEN &&
+          (gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHSCREEN ||
+           gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHPAD) &&
           pointer_on_menu_widget (menu, x_root, y_root))
         {
           priv->drag_start_y = event->button.y_root;
diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c
index 5a7b166..63c6586 100644
--- a/gtk/gtkmenuitem.c
+++ b/gtk/gtkmenuitem.c
@@ -1701,7 +1701,8 @@ gtk_real_menu_item_select (GtkMenuItem *menu_item)
     }
 
   if ((!source_device ||
-       gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHSCREEN) &&
+       (gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHSCREEN &&
+        gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHPAD)) &&
       priv->submenu &&
       (!gtk_widget_get_mapped (priv->submenu) ||
        GTK_MENU (priv->submenu)->priv->tearoff_active))
diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c
index 5099179..95218ff 100644
--- a/gtk/gtkmenushell.c
+++ b/gtk/gtkmenushell.c
@@ -1087,7 +1087,8 @@ gtk_menu_shell_enter_notify (GtkWidget        *widget,
 
                       source_device = gdk_event_get_source_device ((GdkEvent *) event);
 
-                      if (gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHSCREEN)
+                      if (gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHSCREEN ||
+                          gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHPAD)
                         _gtk_menu_item_popup_submenu (menu_item, TRUE);
                     }
                 }
