diff --git a/ChangeLog b/ChangeLog index 5d09056278..156b6c2222 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-04-08 Michael Natterer + + * gtk/gtkmenushell.c (gtk_real_menu_shell_move_current): fix a + touchscreen-mode keynav corner case: when navigating to the parent + menu, make sure we don't close two menus at the same time in case + the deepest open menu has no selectable items. + 2008-04-06 Tristan Van Berkom * gtk/gtkwidget.c: Clarified a g_warning message regarding diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c index 58ce0d73ee..595db329dc 100644 --- a/gtk/gtkmenushell.c +++ b/gtk/gtkmenushell.c @@ -1298,23 +1298,35 @@ gtk_real_menu_shell_move_current (GtkMenuShell *menu_shell, { GtkMenuShell *parent_menu_shell = NULL; gboolean had_selection; + gboolean touchscreen_mode; had_selection = menu_shell->active_menu_item != NULL; + g_object_get (gtk_widget_get_settings (GTK_WIDGET (menu_shell)), + "gtk-touchscreen-mode", &touchscreen_mode, + NULL); + if (menu_shell->parent_menu_shell) parent_menu_shell = GTK_MENU_SHELL (menu_shell->parent_menu_shell); switch (direction) { case GTK_MENU_DIR_PARENT: - if (parent_menu_shell) + if (touchscreen_mode && + menu_shell->active_menu_item && + GTK_MENU_ITEM (menu_shell->active_menu_item)->submenu && + GTK_WIDGET_VISIBLE (GTK_MENU_ITEM (menu_shell->active_menu_item)->submenu)) + { + /* if we are on a menu item that has an open submenu but the + * focus is not in that submenu (e.g. because it's empty or + * has only insensitive items), close that submenu instead + * of running into the code below which would close *this* + * menu. + */ + _gtk_menu_item_popdown_submenu (menu_shell->active_menu_item); + } + else if (parent_menu_shell) { - gboolean touchscreen_mode; - - g_object_get (gtk_widget_get_settings (GTK_WIDGET (menu_shell)), - "gtk-touchscreen-mode", &touchscreen_mode, - NULL); - if (touchscreen_mode) { /* close menu when returning from submenu. */