From 94946ec0e4cb3ad11ff7fc7f2bf710c927240e68 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Sat, 6 Jul 2002 00:24:28 +0000 Subject: [PATCH] Add an extra parameter to _gtk_menu_item_select_first() to allow us to Fri Jul 5 20:18:23 2002 Owen Taylor * gtk/gtkmenushell.[ch] gtk/gtkmenubar.c gtk/gtkmenuitem.c gtk/gtkentry.c gtk/gtktextview.c: Add an extra parameter to _gtk_menu_item_select_first() to allow us to choose whether we want to select the first item predictably or to select the first sensitive item. Fixes problem with insensitive menu items and keynav. (#85796, reported by Bill Haneman and others.) --- ChangeLog | 10 ++++++++++ ChangeLog.pre-2-10 | 10 ++++++++++ ChangeLog.pre-2-2 | 10 ++++++++++ ChangeLog.pre-2-4 | 10 ++++++++++ ChangeLog.pre-2-6 | 10 ++++++++++ ChangeLog.pre-2-8 | 10 ++++++++++ gtk/gtkentry.c | 2 +- gtk/gtkmenubar.c | 2 +- gtk/gtkmenuitem.c | 2 +- gtk/gtkmenushell.c | 49 +++++++++++++++++++++++++++++++++++++++------- gtk/gtkmenushell.h | 3 ++- gtk/gtktextview.c | 2 +- 12 files changed, 108 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 29861b441b..f48028305a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Fri Jul 5 20:18:23 2002 Owen Taylor + + * gtk/gtkmenushell.[ch] gtk/gtkmenubar.c gtk/gtkmenuitem.c + gtk/gtkentry.c gtk/gtktextview.c: Add an extra parameter + to _gtk_menu_item_select_first() to allow us to choose + whether we want to select the first item predictably + or to select the first sensitive item. Fixes problem + with insensitive menu items and keynav. (#85796, + reported by Bill Haneman and others.) + Fri Jul 5 02:50:24 2002 Jonathan Blandford * gtk/gtktreeview.c (gtk_tree_view_collapse_all): fix warning. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 29861b441b..f48028305a 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,13 @@ +Fri Jul 5 20:18:23 2002 Owen Taylor + + * gtk/gtkmenushell.[ch] gtk/gtkmenubar.c gtk/gtkmenuitem.c + gtk/gtkentry.c gtk/gtktextview.c: Add an extra parameter + to _gtk_menu_item_select_first() to allow us to choose + whether we want to select the first item predictably + or to select the first sensitive item. Fixes problem + with insensitive menu items and keynav. (#85796, + reported by Bill Haneman and others.) + Fri Jul 5 02:50:24 2002 Jonathan Blandford * gtk/gtktreeview.c (gtk_tree_view_collapse_all): fix warning. diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 29861b441b..f48028305a 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,13 @@ +Fri Jul 5 20:18:23 2002 Owen Taylor + + * gtk/gtkmenushell.[ch] gtk/gtkmenubar.c gtk/gtkmenuitem.c + gtk/gtkentry.c gtk/gtktextview.c: Add an extra parameter + to _gtk_menu_item_select_first() to allow us to choose + whether we want to select the first item predictably + or to select the first sensitive item. Fixes problem + with insensitive menu items and keynav. (#85796, + reported by Bill Haneman and others.) + Fri Jul 5 02:50:24 2002 Jonathan Blandford * gtk/gtktreeview.c (gtk_tree_view_collapse_all): fix warning. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 29861b441b..f48028305a 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,13 @@ +Fri Jul 5 20:18:23 2002 Owen Taylor + + * gtk/gtkmenushell.[ch] gtk/gtkmenubar.c gtk/gtkmenuitem.c + gtk/gtkentry.c gtk/gtktextview.c: Add an extra parameter + to _gtk_menu_item_select_first() to allow us to choose + whether we want to select the first item predictably + or to select the first sensitive item. Fixes problem + with insensitive menu items and keynav. (#85796, + reported by Bill Haneman and others.) + Fri Jul 5 02:50:24 2002 Jonathan Blandford * gtk/gtktreeview.c (gtk_tree_view_collapse_all): fix warning. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 29861b441b..f48028305a 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,13 @@ +Fri Jul 5 20:18:23 2002 Owen Taylor + + * gtk/gtkmenushell.[ch] gtk/gtkmenubar.c gtk/gtkmenuitem.c + gtk/gtkentry.c gtk/gtktextview.c: Add an extra parameter + to _gtk_menu_item_select_first() to allow us to choose + whether we want to select the first item predictably + or to select the first sensitive item. Fixes problem + with insensitive menu items and keynav. (#85796, + reported by Bill Haneman and others.) + Fri Jul 5 02:50:24 2002 Jonathan Blandford * gtk/gtktreeview.c (gtk_tree_view_collapse_all): fix warning. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 29861b441b..f48028305a 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,13 @@ +Fri Jul 5 20:18:23 2002 Owen Taylor + + * gtk/gtkmenushell.[ch] gtk/gtkmenubar.c gtk/gtkmenuitem.c + gtk/gtkentry.c gtk/gtktextview.c: Add an extra parameter + to _gtk_menu_item_select_first() to allow us to choose + whether we want to select the first item predictably + or to select the first sensitive item. Fixes problem + with insensitive menu items and keynav. (#85796, + reported by Bill Haneman and others.) + Fri Jul 5 02:50:24 2002 Jonathan Blandford * gtk/gtktreeview.c (gtk_tree_view_collapse_all): fix warning. diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 0d87bf3082..5901faa75a 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -3905,7 +3905,7 @@ popup_targets_received (GtkClipboard *clipboard, gtk_menu_popup (GTK_MENU (entry->popup_menu), NULL, NULL, popup_position_func, entry, info->button, info->time); - _gtk_menu_shell_select_first (GTK_MENU_SHELL (entry->popup_menu)); + _gtk_menu_shell_select_first (GTK_MENU_SHELL (entry->popup_menu), FALSE); } } diff --git a/gtk/gtkmenubar.c b/gtk/gtkmenubar.c index 5b2a546198..7f891f2f15 100644 --- a/gtk/gtkmenubar.c +++ b/gtk/gtkmenubar.c @@ -450,7 +450,7 @@ window_key_press_handler (GtkWidget *widget, GtkMenuShell *menu_shell = GTK_MENU_SHELL (menubars->data); _gtk_menu_shell_activate (menu_shell); - _gtk_menu_shell_select_first (menu_shell); + _gtk_menu_shell_select_first (menu_shell, FALSE); g_list_free (menubars); diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c index a51eb7a7c5..7b50838b3a 100644 --- a/gtk/gtkmenuitem.c +++ b/gtk/gtkmenuitem.c @@ -790,7 +790,7 @@ gtk_real_menu_item_activate_item (GtkMenuItem *menu_item) gtk_menu_shell_select_item (GTK_MENU_SHELL (widget->parent), widget); gtk_menu_item_popup_submenu (widget); - _gtk_menu_shell_select_first (GTK_MENU_SHELL (menu_item->submenu)); + _gtk_menu_shell_select_first (GTK_MENU_SHELL (menu_item->submenu), FALSE); submenu = GTK_MENU_SHELL (menu_item->submenu); } } diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c index bb5d4b42bd..76acee8867 100644 --- a/gtk/gtkmenushell.c +++ b/gtk/gtkmenushell.c @@ -992,12 +992,19 @@ gtk_menu_shell_move_selected (GtkMenuShell *menu_shell, /** * _gtk_menu_shell_select_first: * @menu_shell: a #GtkMenuShell + * @search_sensitive: if %TRUE, search for the first selectable + * menu item, otherwise select nothing if + * the first item isn't sensitive. This + * should be %FALSE if the menu is being + * popped up initially. * - * Select the first visible child of the menu shell, unless - * it's a tearoff item. + * Select the first visible or selectable child of the menu shell; + * don't select tearoff items unless the only item is a tearoff + * item. **/ void -_gtk_menu_shell_select_first (GtkMenuShell *menu_shell) +_gtk_menu_shell_select_first (GtkMenuShell *menu_shell, + gboolean search_sensitive) { GtkWidget *to_select = NULL; GList *tmp_list; @@ -1007,7 +1014,8 @@ _gtk_menu_shell_select_first (GtkMenuShell *menu_shell) { GtkWidget *child = tmp_list->data; - if (GTK_WIDGET_VISIBLE (child)) + if ((!search_sensitive && GTK_WIDGET_VISIBLE (child)) || + _gtk_menu_item_is_selectable (child)) { to_select = child; if (!GTK_IS_TEAROFF_MENU_ITEM (child)) @@ -1021,6 +1029,33 @@ _gtk_menu_shell_select_first (GtkMenuShell *menu_shell) gtk_menu_shell_select_item (menu_shell, to_select); } +static void +gtk_menu_shell_select_last (GtkMenuShell *menu_shell, + gboolean search_sensitive) +{ + GtkWidget *to_select = NULL; + GList *tmp_list; + + tmp_list = g_list_last (menu_shell->children); + while (tmp_list) + { + GtkWidget *child = tmp_list->data; + + if ((!search_sensitive && GTK_WIDGET_VISIBLE (child)) || + _gtk_menu_item_is_selectable (child)) + { + to_select = child; + if (!GTK_IS_TEAROFF_MENU_ITEM (child)) + break; + } + + tmp_list = tmp_list->prev; + } + + if (to_select) + gtk_menu_shell_select_item (menu_shell, to_select); +} + static void gtk_menu_shell_select_submenu_first (GtkMenuShell *menu_shell) { @@ -1029,7 +1064,7 @@ gtk_menu_shell_select_submenu_first (GtkMenuShell *menu_shell) menu_item = GTK_MENU_ITEM (menu_shell->active_menu_item); if (menu_item->submenu) - _gtk_menu_shell_select_first (GTK_MENU_SHELL (menu_item->submenu)); + _gtk_menu_shell_select_first (GTK_MENU_SHELL (menu_item->submenu), TRUE); } static void @@ -1095,14 +1130,14 @@ gtk_real_menu_shell_move_current (GtkMenuShell *menu_shell, if (!had_selection && !menu_shell->active_menu_item && menu_shell->children) - gtk_menu_shell_select_item (menu_shell, g_list_last (menu_shell->children)->data); + gtk_menu_shell_select_last (menu_shell, TRUE); break; case GTK_MENU_DIR_NEXT: gtk_menu_shell_move_selected (menu_shell, 1); if (!had_selection && !menu_shell->active_menu_item && menu_shell->children) - gtk_menu_shell_select_item (menu_shell, menu_shell->children->data); + _gtk_menu_shell_select_first (menu_shell, TRUE); break; } diff --git a/gtk/gtkmenushell.h b/gtk/gtkmenushell.h index 9edb887b32..d7529dc059 100644 --- a/gtk/gtkmenushell.h +++ b/gtk/gtkmenushell.h @@ -111,7 +111,8 @@ void gtk_menu_shell_activate_item (GtkMenuShell *menu_shell, GtkWidget *menu_item, gboolean force_deactivate); -void _gtk_menu_shell_select_first (GtkMenuShell *menu_shell); +void _gtk_menu_shell_select_first (GtkMenuShell *menu_shell, + gboolean search_sensitive); void _gtk_menu_shell_activate (GtkMenuShell *menu_shell); #ifdef __cplusplus diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 9468c595f9..3a29d563b6 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -6417,7 +6417,7 @@ popup_targets_received (GtkClipboard *clipboard, gtk_menu_popup (GTK_MENU (text_view->popup_menu), NULL, NULL, popup_position_func, text_view, 0, gtk_get_current_event_time ()); - _gtk_menu_shell_select_first (GTK_MENU_SHELL (text_view->popup_menu)); + _gtk_menu_shell_select_first (GTK_MENU_SHELL (text_view->popup_menu), FALSE); } }