From c83ead5eeadf5ad1b6765049f65e815da48b37eb Mon Sep 17 00:00:00 2001 From: Daniel Boles Date: Thu, 19 Jan 2017 03:12:32 +0000 Subject: [PATCH] combobox: Also preselect active item in grid popup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit i.e. when wrap-width > 0. This was only being done for non-grid cases. So, ComboBoxes in grid mode did not indicate their selection when popped up and required users to keynav from ‘nothing’ (at the top-left) to the item they wanted to select. By selecting the active item in advance, now it’s highlighted & acts as the starting point for keynav around the grid --- gtk/gtkcombobox.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c index 8173876d36..72e94a198a 100644 --- a/gtk/gtkcombobox.c +++ b/gtk/gtkcombobox.c @@ -1694,6 +1694,7 @@ gtk_combo_box_menu_popup (GtkComboBox *combo_box, gint active_item; GtkAllocation border_allocation; GtkAllocation content_allocation; + GtkWidget *active; update_menu_sensitivity (combo_box, priv->popup_widget); @@ -1733,6 +1734,8 @@ gtk_combo_box_menu_popup (GtkComboBox *combo_box, g_object_set (priv->popup_widget, "menu-type-hint", GDK_WINDOW_TYPE_HINT_COMBO, NULL); + active = gtk_menu_get_active (GTK_MENU (priv->popup_widget)); + if (priv->wrap_width > 0 || priv->cell_view == NULL) { gtk_css_gadget_get_border_allocation (priv->gadget, &border_allocation, NULL); @@ -1754,7 +1757,6 @@ gtk_combo_box_menu_popup (GtkComboBox *combo_box, else { /* FIXME handle nested menus better */ - GtkWidget *active = gtk_menu_get_active (GTK_MENU (priv->popup_widget));; gint rect_anchor_dy = -2; GList *i; GtkWidget *child; @@ -1805,15 +1807,15 @@ gtk_combo_box_menu_popup (GtkComboBox *combo_box, GDK_GRAVITY_WEST, GDK_GRAVITY_NORTH_WEST, trigger_event); - - /* As a hack, re-get the active item, in case a popup handler, like that - * of FileChooserButton, just caused the menu to be refiltered, making the - * previous active item pointer invalid now. This seems pretty ugly and - * makes the y-offset loop pointless for such cases, so FIXME later? */ - active = gtk_menu_get_active (GTK_MENU (priv->popup_widget)); - if (active) - gtk_menu_shell_select_item (GTK_MENU_SHELL (priv->popup_widget), active); } + + /* Re-get the active item before selecting it, as a popped-up handler – like + * that of FileChooserButton in folder mode – can refilter the model, making + * the original active item pointer invalid. This seems ugly and makes some + * of the above code pointless in such cases, so hopefully we can FIXME. */ + active = gtk_menu_get_active (GTK_MENU (priv->popup_widget)); + if (active && gtk_widget_get_visible (active)) + gtk_menu_shell_select_item (GTK_MENU_SHELL (priv->popup_widget), active); } static gboolean