diff options
author | Matthias Clasen <mclasen@redhat.com> | 2011-01-20 23:38:50 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2011-01-20 23:40:14 -0500 |
commit | f941f7b1230b78621cf529437522836a22e9554a (patch) | |
tree | 8743b0dedb3721b333c52d304c40e4cdd557fb37 /gtk/gtkcombobox.c | |
parent | d0ba16a3b24739bc644c72287aa07227613f0d61 (diff) | |
download | gtk+-f941f7b1230b78621cf529437522836a22e9554a.tar.gz |
Fix keynav issue in menu mode
Skipping insensitive and separator rows was broken in menu mode.
https://bugzilla.gnome.org/show_bug.cgi?id=639845
Diffstat (limited to 'gtk/gtkcombobox.c')
-rw-r--r-- | gtk/gtkcombobox.c | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c index 67002e0ed6..febf8a9845 100644 --- a/gtk/gtkcombobox.c +++ b/gtk/gtkcombobox.c @@ -104,7 +104,6 @@ struct _GtkComboBoxPrivate GtkTreeRowReference *active_row; GtkWidget *tree_view; - GtkTreeViewColumn *column; GtkWidget *cell_view; GtkWidget *cell_view_frame; @@ -129,7 +128,8 @@ struct _GtkComboBoxPrivate guint resize_idle_id; /* For "has-entry" specific behavior we track - * an automated cell renderer and text column */ + * an automated cell renderer and text column + */ gint text_column; GtkCellRenderer *text_renderer; @@ -1961,12 +1961,12 @@ gtk_combo_box_list_position (GtkComboBox *combo_box, } static gboolean -cell_view_is_sensitive (GtkCellView *cell_view) +cell_layout_is_sensitive (GtkCellLayout *layout) { GList *cells, *list; gboolean sensitive; - cells = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (cell_view)); + cells = gtk_cell_layout_get_cells (layout); sensitive = FALSE; for (list = cells; list; list = list->next) @@ -1982,15 +1982,21 @@ cell_view_is_sensitive (GtkCellView *cell_view) } static gboolean +cell_is_sensitive (GtkCellRenderer *cell, + gpointer data) +{ + gboolean *sensitive = data; + + g_object_get (cell, "sensitive", sensitive, NULL); + + return *sensitive; +} + +static gboolean tree_column_row_is_sensitive (GtkComboBox *combo_box, GtkTreeIter *iter) { GtkComboBoxPrivate *priv = combo_box->priv; - GList *cells, *list; - gboolean sensitive; - - if (!priv->column) - return TRUE; if (priv->row_separator_func) { @@ -1999,23 +2005,20 @@ tree_column_row_is_sensitive (GtkComboBox *combo_box, return FALSE; } - gtk_tree_view_column_cell_set_cell_data (priv->column, - priv->model, - iter, FALSE, FALSE); + if (priv->area) + { + gboolean sensitive; - cells = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (priv->column)); + gtk_cell_area_apply_attributes (priv->area, priv->model, iter, FALSE, FALSE); - sensitive = FALSE; - for (list = cells; list; list = list->next) - { - g_object_get (list->data, "sensitive", &sensitive, NULL); + sensitive = FALSE; - if (sensitive) - break; + gtk_cell_area_foreach (priv->area, cell_is_sensitive, &sensitive); + + return sensitive; } - g_list_free (cells); - return sensitive; + return TRUE; } static void @@ -2049,7 +2052,7 @@ update_menu_sensitivity (GtkComboBox *combo_box, } else { - sensitive = cell_view_is_sensitive (GTK_CELL_VIEW (cell_view)); + sensitive = cell_layout_is_sensitive (GTK_CELL_LAYOUT (cell_view)); if (menu != priv->popup_widget && child == children) { @@ -3048,8 +3051,6 @@ gtk_combo_box_menu_destroy (GtkComboBox *combo_box) priv->arrow = NULL; priv->separator = NULL; - priv->column = NULL; - /* changing the popup window will unref the menu and the children */ } @@ -3325,8 +3326,8 @@ gtk_combo_box_list_setup (GtkComboBox *combo_box) if (priv->model) gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), priv->model); - priv->column = gtk_tree_view_column_new_with_area (priv->area); - gtk_tree_view_append_column (GTK_TREE_VIEW (priv->tree_view), priv->column); + gtk_tree_view_append_column (GTK_TREE_VIEW (priv->tree_view), + gtk_tree_view_column_new_with_area (priv->area)); if (gtk_tree_row_reference_valid (priv->active_row)) { |