combobox: use a private variable when possible

Instead of dereferencing the same variable over and over.
This commit is contained in:
Cosimo Cecchi 2015-12-21 18:32:14 -08:00
parent f03268eabe
commit a90d928a34

View File

@ -1267,19 +1267,19 @@ gtk_combo_box_get_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_MODEL: case PROP_MODEL:
g_value_set_object (value, combo_box->priv->model); g_value_set_object (value, priv->model);
break; break;
case PROP_WRAP_WIDTH: case PROP_WRAP_WIDTH:
g_value_set_int (value, combo_box->priv->wrap_width); g_value_set_int (value, priv->wrap_width);
break; break;
case PROP_ROW_SPAN_COLUMN: case PROP_ROW_SPAN_COLUMN:
g_value_set_int (value, combo_box->priv->row_column); g_value_set_int (value, priv->row_column);
break; break;
case PROP_COLUMN_SPAN_COLUMN: case PROP_COLUMN_SPAN_COLUMN:
g_value_set_int (value, combo_box->priv->col_column); g_value_set_int (value, priv->col_column);
break; break;
case PROP_ACTIVE: case PROP_ACTIVE:
@ -1293,7 +1293,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS;
break; break;
case PROP_HAS_FRAME: case PROP_HAS_FRAME:
g_value_set_boolean (value, combo_box->priv->has_frame); g_value_set_boolean (value, priv->has_frame);
break; break;
case PROP_TEAROFF_TITLE: case PROP_TEAROFF_TITLE:
@ -1303,15 +1303,15 @@ G_GNUC_END_IGNORE_DEPRECATIONS;
break; break;
case PROP_POPUP_SHOWN: case PROP_POPUP_SHOWN:
g_value_set_boolean (value, combo_box->priv->popup_shown); g_value_set_boolean (value, priv->popup_shown);
break; break;
case PROP_BUTTON_SENSITIVITY: case PROP_BUTTON_SENSITIVITY:
g_value_set_enum (value, combo_box->priv->button_sensitivity); g_value_set_enum (value, priv->button_sensitivity);
break; break;
case PROP_POPUP_FIXED_WIDTH: case PROP_POPUP_FIXED_WIDTH:
g_value_set_boolean (value, combo_box->priv->popup_fixed_width); g_value_set_boolean (value, priv->popup_fixed_width);
break; break;
case PROP_EDITING_CANCELED: case PROP_EDITING_CANCELED:
@ -1806,29 +1806,27 @@ gtk_combo_box_menu_position_over (GtkMenu *menu,
gboolean *push_in, gboolean *push_in,
gpointer user_data) gpointer user_data)
{ {
GtkComboBox *combo_box; GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
GtkWidget *active; GtkWidget *widget = GTK_WIDGET (combo_box);
GtkWidget *child; GtkComboBoxPrivate *priv = combo_box->priv;
GtkWidget *widget; GtkWidget *active;
GtkAllocation allocation; GtkWidget *child;
GtkAllocation child_allocation; GtkAllocation allocation;
GList *children; GtkAllocation child_allocation;
gint screen_width; GList *children;
gint menu_xpos; gint screen_width;
gint menu_ypos; gint menu_xpos;
gint menu_width; gint menu_ypos;
gint menu_width;
combo_box = GTK_COMBO_BOX (user_data); active = gtk_menu_get_active (GTK_MENU (priv->popup_widget));
widget = GTK_WIDGET (combo_box);
active = gtk_menu_get_active (GTK_MENU (combo_box->priv->popup_widget));
gtk_widget_get_allocation (widget, &allocation); gtk_widget_get_allocation (widget, &allocation);
menu_xpos = allocation.x; menu_xpos = allocation.x;
menu_ypos = allocation.y + allocation.height / 2 - 2; menu_ypos = allocation.y + allocation.height / 2 - 2;
if (combo_box->priv->popup_fixed_width) if (priv->popup_fixed_width)
gtk_widget_get_preferred_width (GTK_WIDGET (menu), &menu_width, NULL); gtk_widget_get_preferred_width (GTK_WIDGET (menu), &menu_width, NULL);
else else
gtk_widget_get_preferred_width (GTK_WIDGET (menu), NULL, &menu_width); gtk_widget_get_preferred_width (GTK_WIDGET (menu), NULL, &menu_width);
@ -1839,7 +1837,7 @@ gtk_combo_box_menu_position_over (GtkMenu *menu,
menu_ypos -= child_allocation.height / 2; menu_ypos -= child_allocation.height / 2;
} }
children = GTK_MENU_SHELL (combo_box->priv->popup_widget)->priv->children; children = GTK_MENU_SHELL (priv->popup_widget)->priv->children;
while (children) while (children)
{ {
child = children->data; child = children->data;
@ -1939,7 +1937,7 @@ gtk_combo_box_list_position (GtkComboBox *combo_box,
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scrolled_window), gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scrolled_window),
hpolicy, vpolicy); hpolicy, vpolicy);
if (combo_box->priv->popup_fixed_width) if (priv->popup_fixed_width)
{ {
gtk_widget_get_preferred_size (priv->scrolled_window, &popup_req, NULL); gtk_widget_get_preferred_size (priv->scrolled_window, &popup_req, NULL);
@ -2139,7 +2137,7 @@ gtk_combo_box_menu_popup (GtkComboBox *combo_box,
gtk_widget_set_size_request (priv->popup_widget, -1, -1); gtk_widget_set_size_request (priv->popup_widget, -1, -1);
gtk_widget_get_preferred_width (priv->popup_widget, &min_width, &nat_width); gtk_widget_get_preferred_width (priv->popup_widget, &min_width, &nat_width);
if (combo_box->priv->popup_fixed_width) if (priv->popup_fixed_width)
width = MAX (width, min_width); width = MAX (width, min_width);
else else
width = MAX (width, nat_width); width = MAX (width, nat_width);
@ -2406,7 +2404,7 @@ gtk_combo_box_size_allocate (GtkWidget *widget,
{ {
GtkAllocation button_allocation; GtkAllocation button_allocation;
gtk_widget_get_preferred_size (combo_box->priv->button, gtk_widget_get_preferred_size (priv->button,
&req, NULL); &req, NULL);
if (is_rtl) if (is_rtl)
@ -2420,7 +2418,7 @@ gtk_combo_box_size_allocate (GtkWidget *widget,
button_allocation.height = allocation->height; button_allocation.height = allocation->height;
button_allocation.height = MAX (1, button_allocation.height); button_allocation.height = MAX (1, button_allocation.height);
gtk_widget_size_allocate (combo_box->priv->button, gtk_widget_size_allocate (priv->button,
&button_allocation); &button_allocation);
if (is_rtl) if (is_rtl)
@ -2451,7 +2449,7 @@ gtk_combo_box_size_allocate (GtkWidget *widget,
gtk_widget_get_allocation (GTK_WIDGET (combo_box), &combo_box_allocation); gtk_widget_get_allocation (GTK_WIDGET (combo_box), &combo_box_allocation);
gtk_widget_set_size_request (priv->popup_widget, -1, -1); gtk_widget_set_size_request (priv->popup_widget, -1, -1);
if (combo_box->priv->popup_fixed_width) if (priv->popup_fixed_width)
gtk_widget_get_preferred_width (priv->popup_widget, &menu_width, NULL); gtk_widget_get_preferred_width (priv->popup_widget, &menu_width, NULL);
else else
gtk_widget_get_preferred_width (priv->popup_widget, NULL, &menu_width); gtk_widget_get_preferred_width (priv->popup_widget, NULL, &menu_width);
@ -2757,6 +2755,7 @@ gtk_combo_box_scroll_event (GtkWidget *widget,
GdkEventScroll *event) GdkEventScroll *event)
{ {
GtkComboBox *combo_box = GTK_COMBO_BOX (widget); GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
GtkComboBoxPrivate *priv = combo_box->priv;
gboolean found; gboolean found;
GtkTreeIter iter; GtkTreeIter iter;
GtkTreeIter new_iter; GtkTreeIter new_iter;
@ -2765,10 +2764,10 @@ gtk_combo_box_scroll_event (GtkWidget *widget,
return TRUE; return TRUE;
if (event->direction == GDK_SCROLL_UP) if (event->direction == GDK_SCROLL_UP)
found = tree_prev (combo_box, combo_box->priv->model, found = tree_prev (combo_box, priv->model,
&iter, &new_iter); &iter, &new_iter);
else else
found = tree_next (combo_box, combo_box->priv->model, found = tree_next (combo_box, priv->model,
&iter, &new_iter); &iter, &new_iter);
if (found) if (found)
@ -2815,8 +2814,7 @@ gtk_combo_box_menu_setup (GtkComboBox *combo_box)
_gtk_tree_menu_set_wrap_width (GTK_TREE_MENU (menu), priv->wrap_width); _gtk_tree_menu_set_wrap_width (GTK_TREE_MENU (menu), priv->wrap_width);
_gtk_tree_menu_set_row_span_column (GTK_TREE_MENU (menu), priv->row_column); _gtk_tree_menu_set_row_span_column (GTK_TREE_MENU (menu), priv->row_column);
_gtk_tree_menu_set_column_span_column (GTK_TREE_MENU (menu), priv->col_column); _gtk_tree_menu_set_column_span_column (GTK_TREE_MENU (menu), priv->col_column);
_gtk_tree_menu_set_tearoff (GTK_TREE_MENU (menu), _gtk_tree_menu_set_tearoff (GTK_TREE_MENU (menu), priv->add_tearoffs);
combo_box->priv->add_tearoffs);
g_signal_connect (menu, "menu-activate", g_signal_connect (menu, "menu-activate",
G_CALLBACK (gtk_combo_box_menu_activate), combo_box); G_CALLBACK (gtk_combo_box_menu_activate), combo_box);
@ -2897,13 +2895,14 @@ gtk_combo_box_menu_activate (GtkWidget *menu,
static void static void
gtk_combo_box_update_sensitivity (GtkComboBox *combo_box) gtk_combo_box_update_sensitivity (GtkComboBox *combo_box)
{ {
GtkComboBoxPrivate *priv = combo_box->priv;
GtkTreeIter iter; GtkTreeIter iter;
gboolean sensitive = TRUE; /* fool code checkers */ gboolean sensitive = TRUE; /* fool code checkers */
if (!combo_box->priv->button) if (!priv->button)
return; return;
switch (combo_box->priv->button_sensitivity) switch (priv->button_sensitivity)
{ {
case GTK_SENSITIVITY_ON: case GTK_SENSITIVITY_ON:
sensitive = TRUE; sensitive = TRUE;
@ -2912,15 +2911,15 @@ gtk_combo_box_update_sensitivity (GtkComboBox *combo_box)
sensitive = FALSE; sensitive = FALSE;
break; break;
case GTK_SENSITIVITY_AUTO: case GTK_SENSITIVITY_AUTO:
sensitive = combo_box->priv->model && sensitive = priv->model &&
gtk_tree_model_get_iter_first (combo_box->priv->model, &iter); gtk_tree_model_get_iter_first (priv->model, &iter);
break; break;
default: default:
g_assert_not_reached (); g_assert_not_reached ();
break; break;
} }
gtk_widget_set_sensitive (combo_box->priv->button, sensitive); gtk_widget_set_sensitive (priv->button, sensitive);
} }
static void static void
@ -3317,6 +3316,7 @@ gtk_combo_box_list_key_press (GtkWidget *widget,
gpointer data) gpointer data)
{ {
GtkComboBox *combo_box = GTK_COMBO_BOX (data); GtkComboBox *combo_box = GTK_COMBO_BOX (data);
GtkComboBoxPrivate *priv = combo_box->priv;
GtkTreeIter iter; GtkTreeIter iter;
if (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_ISO_Enter || event->keyval == GDK_KEY_KP_Enter || if (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_ISO_Enter || event->keyval == GDK_KEY_KP_Enter ||
@ -3326,11 +3326,11 @@ gtk_combo_box_list_key_press (GtkWidget *widget,
gtk_combo_box_popdown (combo_box); gtk_combo_box_popdown (combo_box);
if (combo_box->priv->model) if (priv->model)
{ {
GtkTreeSelection *sel; GtkTreeSelection *sel;
sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (combo_box->priv->tree_view)); sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
if (gtk_tree_selection_get_selected (sel, &model, &iter)) if (gtk_tree_selection_get_selected (sel, &model, &iter))
gtk_combo_box_set_active_iter (combo_box, &iter); gtk_combo_box_set_active_iter (combo_box, &iter);
@ -3355,14 +3355,14 @@ gtk_combo_box_list_auto_scroll (GtkComboBox *combo_box,
gint x, gint x,
gint y) gint y)
{ {
GtkComboBoxPrivate *priv = combo_box->priv;
GtkAdjustment *adj; GtkAdjustment *adj;
GtkAllocation allocation; GtkAllocation allocation;
GtkWidget *tree_view = combo_box->priv->tree_view;
gdouble value; gdouble value;
gtk_widget_get_allocation (tree_view, &allocation); gtk_widget_get_allocation (priv->tree_view, &allocation);
adj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (combo_box->priv->scrolled_window)); adj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (priv->scrolled_window));
if (adj && gtk_adjustment_get_upper (adj) - gtk_adjustment_get_lower (adj) > gtk_adjustment_get_page_size (adj)) if (adj && gtk_adjustment_get_upper (adj) - gtk_adjustment_get_lower (adj) > gtk_adjustment_get_page_size (adj))
{ {
if (x <= allocation.x && if (x <= allocation.x &&
@ -3379,7 +3379,7 @@ gtk_combo_box_list_auto_scroll (GtkComboBox *combo_box,
} }
} }
adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (combo_box->priv->scrolled_window)); adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scrolled_window));
if (adj && gtk_adjustment_get_upper (adj) - gtk_adjustment_get_lower (adj) > gtk_adjustment_get_page_size (adj)) if (adj && gtk_adjustment_get_upper (adj) - gtk_adjustment_get_lower (adj) > gtk_adjustment_get_page_size (adj))
{ {
if (y <= allocation.y && if (y <= allocation.y &&
@ -3830,14 +3830,18 @@ void
gtk_combo_box_set_active (GtkComboBox *combo_box, gtk_combo_box_set_active (GtkComboBox *combo_box,
gint index_) gint index_)
{ {
GtkComboBoxPrivate *priv;
GtkTreePath *path = NULL; GtkTreePath *path = NULL;
g_return_if_fail (GTK_IS_COMBO_BOX (combo_box)); g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
g_return_if_fail (index_ >= -1); g_return_if_fail (index_ >= -1);
if (combo_box->priv->model == NULL) priv = combo_box->priv;
if (priv->model == NULL)
{ {
/* Save index, in case the model is set after the index */ /* Save index, in case the model is set after the index */
combo_box->priv->active = index_; priv->active = index_;
if (index_ != -1) if (index_ != -1)
return; return;
} }
@ -3923,7 +3927,7 @@ gtk_combo_box_set_active_internal (GtkComboBox *combo_box,
g_signal_emit (combo_box, combo_box_signals[CHANGED], 0); g_signal_emit (combo_box, combo_box_signals[CHANGED], 0);
g_object_notify (G_OBJECT (combo_box), "active"); g_object_notify (G_OBJECT (combo_box), "active");
if (combo_box->priv->id_column >= 0) if (priv->id_column >= 0)
g_object_notify (G_OBJECT (combo_box), "active-id"); g_object_notify (G_OBJECT (combo_box), "active-id");
} }
@ -3943,16 +3947,19 @@ gboolean
gtk_combo_box_get_active_iter (GtkComboBox *combo_box, gtk_combo_box_get_active_iter (GtkComboBox *combo_box,
GtkTreeIter *iter) GtkTreeIter *iter)
{ {
GtkComboBoxPrivate *priv;
GtkTreePath *path; GtkTreePath *path;
gboolean result; gboolean result;
g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), FALSE); g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), FALSE);
if (!gtk_tree_row_reference_valid (combo_box->priv->active_row)) priv = combo_box->priv;
if (!gtk_tree_row_reference_valid (priv->active_row))
return FALSE; return FALSE;
path = gtk_tree_row_reference_get_path (combo_box->priv->active_row); path = gtk_tree_row_reference_get_path (priv->active_row);
result = gtk_tree_model_get_iter (combo_box->priv->model, iter, path); result = gtk_tree_model_get_iter (priv->model, iter, path);
gtk_tree_path_free (path); gtk_tree_path_free (path);
return result; return result;
@ -4001,9 +4008,13 @@ void
gtk_combo_box_set_model (GtkComboBox *combo_box, gtk_combo_box_set_model (GtkComboBox *combo_box,
GtkTreeModel *model) GtkTreeModel *model)
{ {
GtkComboBoxPrivate *priv;
g_return_if_fail (GTK_IS_COMBO_BOX (combo_box)); g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
g_return_if_fail (model == NULL || GTK_IS_TREE_MODEL (model)); g_return_if_fail (model == NULL || GTK_IS_TREE_MODEL (model));
priv = combo_box->priv;
if (model == combo_box->priv->model) if (model == combo_box->priv->model)
return; return;
@ -4012,50 +4023,50 @@ gtk_combo_box_set_model (GtkComboBox *combo_box,
if (model == NULL) if (model == NULL)
goto out; goto out;
combo_box->priv->model = model; priv->model = model;
g_object_ref (combo_box->priv->model); g_object_ref (priv->model);
combo_box->priv->inserted_id = priv->inserted_id =
g_signal_connect (combo_box->priv->model, "row-inserted", g_signal_connect (priv->model, "row-inserted",
G_CALLBACK (gtk_combo_box_model_row_inserted), G_CALLBACK (gtk_combo_box_model_row_inserted),
combo_box); combo_box);
combo_box->priv->deleted_id = priv->deleted_id =
g_signal_connect (combo_box->priv->model, "row-deleted", g_signal_connect (priv->model, "row-deleted",
G_CALLBACK (gtk_combo_box_model_row_deleted), G_CALLBACK (gtk_combo_box_model_row_deleted),
combo_box); combo_box);
combo_box->priv->reordered_id = priv->reordered_id =
g_signal_connect (combo_box->priv->model, "rows-reordered", g_signal_connect (priv->model, "rows-reordered",
G_CALLBACK (gtk_combo_box_model_rows_reordered), G_CALLBACK (gtk_combo_box_model_rows_reordered),
combo_box); combo_box);
combo_box->priv->changed_id = priv->changed_id =
g_signal_connect (combo_box->priv->model, "row-changed", g_signal_connect (priv->model, "row-changed",
G_CALLBACK (gtk_combo_box_model_row_changed), G_CALLBACK (gtk_combo_box_model_row_changed),
combo_box); combo_box);
if (combo_box->priv->tree_view) if (priv->tree_view)
{ {
/* list mode */ /* list mode */
gtk_tree_view_set_model (GTK_TREE_VIEW (combo_box->priv->tree_view), gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view),
combo_box->priv->model); priv->model);
gtk_combo_box_list_popup_resize (combo_box); gtk_combo_box_list_popup_resize (combo_box);
} }
if (GTK_IS_TREE_MENU (combo_box->priv->popup_widget)) if (GTK_IS_TREE_MENU (priv->popup_widget))
{ {
/* menu mode */ /* menu mode */
_gtk_tree_menu_set_model (GTK_TREE_MENU (combo_box->priv->popup_widget), _gtk_tree_menu_set_model (GTK_TREE_MENU (priv->popup_widget),
combo_box->priv->model); priv->model);
} }
if (combo_box->priv->cell_view) if (priv->cell_view)
gtk_cell_view_set_model (GTK_CELL_VIEW (combo_box->priv->cell_view), gtk_cell_view_set_model (GTK_CELL_VIEW (priv->cell_view),
combo_box->priv->model); priv->model);
if (combo_box->priv->active != -1) if (priv->active != -1)
{ {
/* If an index was set in advance, apply it now */ /* If an index was set in advance, apply it now */
gtk_combo_box_set_active (combo_box, combo_box->priv->active); gtk_combo_box_set_active (combo_box, priv->active);
combo_box->priv->active = -1; priv->active = -1;
} }
out: out:
@ -4087,12 +4098,13 @@ static void
gtk_combo_box_real_move_active (GtkComboBox *combo_box, gtk_combo_box_real_move_active (GtkComboBox *combo_box,
GtkScrollType scroll) GtkScrollType scroll)
{ {
GtkComboBoxPrivate *priv = combo_box->priv;
GtkTreeIter iter; GtkTreeIter iter;
GtkTreeIter new_iter; GtkTreeIter new_iter;
gboolean active_iter; gboolean active_iter;
gboolean found; gboolean found;
if (!combo_box->priv->model) if (!priv->model)
{ {
gtk_widget_error_bell (GTK_WIDGET (combo_box)); gtk_widget_error_bell (GTK_WIDGET (combo_box));
return; return;
@ -4107,7 +4119,7 @@ gtk_combo_box_real_move_active (GtkComboBox *combo_box,
case GTK_SCROLL_STEP_LEFT: case GTK_SCROLL_STEP_LEFT:
if (active_iter) if (active_iter)
{ {
found = tree_prev (combo_box, combo_box->priv->model, found = tree_prev (combo_box, priv->model,
&iter, &new_iter); &iter, &new_iter);
break; break;
} }
@ -4117,7 +4129,7 @@ gtk_combo_box_real_move_active (GtkComboBox *combo_box,
case GTK_SCROLL_PAGE_DOWN: case GTK_SCROLL_PAGE_DOWN:
case GTK_SCROLL_PAGE_RIGHT: case GTK_SCROLL_PAGE_RIGHT:
case GTK_SCROLL_END: case GTK_SCROLL_END:
found = tree_last (combo_box, combo_box->priv->model, &new_iter); found = tree_last (combo_box, priv->model, &new_iter);
break; break;
case GTK_SCROLL_STEP_FORWARD: case GTK_SCROLL_STEP_FORWARD:
@ -4125,7 +4137,7 @@ gtk_combo_box_real_move_active (GtkComboBox *combo_box,
case GTK_SCROLL_STEP_RIGHT: case GTK_SCROLL_STEP_RIGHT:
if (active_iter) if (active_iter)
{ {
found = tree_next (combo_box, combo_box->priv->model, found = tree_next (combo_box, priv->model,
&iter, &new_iter); &iter, &new_iter);
break; break;
} }
@ -4135,7 +4147,7 @@ gtk_combo_box_real_move_active (GtkComboBox *combo_box,
case GTK_SCROLL_PAGE_UP: case GTK_SCROLL_PAGE_UP:
case GTK_SCROLL_PAGE_LEFT: case GTK_SCROLL_PAGE_LEFT:
case GTK_SCROLL_START: case GTK_SCROLL_START:
found = tree_first (combo_box, combo_box->priv->model, &new_iter); found = tree_first (combo_box, priv->model, &new_iter);
break; break;
default: default:
@ -4147,8 +4159,8 @@ gtk_combo_box_real_move_active (GtkComboBox *combo_box,
GtkTreePath *old_path; GtkTreePath *old_path;
GtkTreePath *new_path; GtkTreePath *new_path;
old_path = gtk_tree_model_get_path (combo_box->priv->model, &iter); old_path = gtk_tree_model_get_path (priv->model, &iter);
new_path = gtk_tree_model_get_path (combo_box->priv->model, &new_iter); new_path = gtk_tree_model_get_path (priv->model, &new_iter);
if (gtk_tree_path_compare (old_path, new_path) == 0) if (gtk_tree_path_compare (old_path, new_path) == 0)
found = FALSE; found = FALSE;
@ -4210,10 +4222,10 @@ gtk_combo_box_destroy (GtkWidget *widget)
GtkComboBox *combo_box = GTK_COMBO_BOX (widget); GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
GtkComboBoxPrivate *priv = combo_box->priv; GtkComboBoxPrivate *priv = combo_box->priv;
if (combo_box->priv->popup_idle_id > 0) if (priv->popup_idle_id > 0)
{ {
g_source_remove (combo_box->priv->popup_idle_id); g_source_remove (priv->popup_idle_id);
combo_box->priv->popup_idle_id = 0; priv->popup_idle_id = 0;
} }
if (priv->button) if (priv->button)
@ -4233,15 +4245,15 @@ gtk_combo_box_destroy (GtkWidget *widget)
gtk_combo_box_popdown (combo_box); gtk_combo_box_popdown (combo_box);
if (combo_box->priv->row_separator_destroy) if (priv->row_separator_destroy)
combo_box->priv->row_separator_destroy (combo_box->priv->row_separator_data); priv->row_separator_destroy (priv->row_separator_data);
combo_box->priv->row_separator_func = NULL; priv->row_separator_func = NULL;
combo_box->priv->row_separator_data = NULL; priv->row_separator_data = NULL;
combo_box->priv->row_separator_destroy = NULL; priv->row_separator_destroy = NULL;
GTK_WIDGET_CLASS (gtk_combo_box_parent_class)->destroy (widget); GTK_WIDGET_CLASS (gtk_combo_box_parent_class)->destroy (widget);
combo_box->priv->cell_view = NULL; priv->cell_view = NULL;
} }
static void static void
@ -4371,27 +4383,28 @@ static void
gtk_combo_box_dispose(GObject* object) gtk_combo_box_dispose(GObject* object)
{ {
GtkComboBox *combo_box = GTK_COMBO_BOX (object); GtkComboBox *combo_box = GTK_COMBO_BOX (object);
GtkComboBoxPrivate *priv = combo_box->priv;
if (GTK_IS_MENU (combo_box->priv->popup_widget)) if (GTK_IS_MENU (priv->popup_widget))
{ {
gtk_combo_box_menu_destroy (combo_box); gtk_combo_box_menu_destroy (combo_box);
gtk_menu_detach (GTK_MENU (combo_box->priv->popup_widget)); gtk_menu_detach (GTK_MENU (priv->popup_widget));
combo_box->priv->popup_widget = NULL; priv->popup_widget = NULL;
} }
if (combo_box->priv->area) if (priv->area)
{ {
g_object_unref (combo_box->priv->area); g_object_unref (priv->area);
combo_box->priv->area = NULL; priv->area = NULL;
} }
if (GTK_IS_TREE_VIEW (combo_box->priv->tree_view)) if (GTK_IS_TREE_VIEW (priv->tree_view))
gtk_combo_box_list_destroy (combo_box); gtk_combo_box_list_destroy (combo_box);
if (combo_box->priv->popup_window) if (priv->popup_window)
{ {
gtk_widget_destroy (combo_box->priv->popup_window); gtk_widget_destroy (priv->popup_window);
combo_box->priv->popup_window = NULL; priv->popup_window = NULL;
} }
gtk_combo_box_unset_model (combo_box); gtk_combo_box_unset_model (combo_box);
@ -4466,13 +4479,12 @@ popdown_handler (GtkWidget *widget,
static gboolean static gboolean
popup_idle (gpointer data) popup_idle (gpointer data)
{ {
GtkComboBox *combo_box; GtkComboBox *combo_box = GTK_COMBO_BOX (data);
GtkComboBoxPrivate *priv = combo_box->priv;
combo_box = GTK_COMBO_BOX (data); if (GTK_IS_MENU (priv->popup_widget) &&
priv->cell_view)
if (GTK_IS_MENU (combo_box->priv->popup_widget) && g_signal_connect_object (priv->popup_widget,
combo_box->priv->cell_view)
g_signal_connect_object (combo_box->priv->popup_widget,
"unmap", G_CALLBACK (popdown_handler), "unmap", G_CALLBACK (popdown_handler),
combo_box, 0); combo_box, 0);
@ -4482,9 +4494,9 @@ popup_idle (gpointer data)
NULL); NULL);
gtk_combo_box_popup (combo_box); gtk_combo_box_popup (combo_box);
combo_box->priv->popup_idle_id = 0; priv->popup_idle_id = 0;
combo_box->priv->activate_button = 0; priv->activate_button = 0;
combo_box->priv->activate_time = 0; priv->activate_time = 0;
return FALSE; return FALSE;
} }
@ -4494,17 +4506,18 @@ gtk_combo_box_start_editing (GtkCellEditable *cell_editable,
GdkEvent *event) GdkEvent *event)
{ {
GtkComboBox *combo_box = GTK_COMBO_BOX (cell_editable); GtkComboBox *combo_box = GTK_COMBO_BOX (cell_editable);
GtkComboBoxPrivate *priv = combo_box->priv;
GtkWidget *child; GtkWidget *child;
combo_box->priv->is_cell_renderer = TRUE; priv->is_cell_renderer = TRUE;
if (combo_box->priv->cell_view) if (priv->cell_view)
{ {
g_signal_connect_object (combo_box->priv->button, "key-press-event", g_signal_connect_object (priv->button, "key-press-event",
G_CALLBACK (gtk_cell_editable_key_press), G_CALLBACK (gtk_cell_editable_key_press),
cell_editable, 0); cell_editable, 0);
gtk_widget_grab_focus (combo_box->priv->button); gtk_widget_grab_focus (priv->button);
} }
else else
{ {
@ -4515,26 +4528,26 @@ gtk_combo_box_start_editing (GtkCellEditable *cell_editable,
cell_editable, 0); cell_editable, 0);
gtk_widget_grab_focus (child); gtk_widget_grab_focus (child);
gtk_widget_set_can_focus (combo_box->priv->button, FALSE); gtk_widget_set_can_focus (priv->button, FALSE);
} }
/* we do the immediate popup only for the optionmenu-like /* we do the immediate popup only for the optionmenu-like
* appearance * appearance
*/ */
if (combo_box->priv->is_cell_renderer && if (priv->is_cell_renderer &&
combo_box->priv->cell_view && !combo_box->priv->tree_view) priv->cell_view && !priv->tree_view)
{ {
if (event && event->type == GDK_BUTTON_PRESS) if (event && event->type == GDK_BUTTON_PRESS)
{ {
GdkEventButton *event_button = (GdkEventButton *)event; GdkEventButton *event_button = (GdkEventButton *)event;
combo_box->priv->activate_button = event_button->button; priv->activate_button = event_button->button;
combo_box->priv->activate_time = event_button->time; priv->activate_time = event_button->time;
} }
combo_box->priv->popup_idle_id = priv->popup_idle_id =
gdk_threads_add_idle (popup_idle, combo_box); gdk_threads_add_idle (popup_idle, combo_box);
g_source_set_name_by_id (combo_box->priv->popup_idle_id, "[gtk+] popup_idle"); g_source_set_name_by_id (priv->popup_idle_id, "[gtk+] popup_idle");
} }
} }
@ -4573,18 +4586,21 @@ void
gtk_combo_box_set_add_tearoffs (GtkComboBox *combo_box, gtk_combo_box_set_add_tearoffs (GtkComboBox *combo_box,
gboolean add_tearoffs) gboolean add_tearoffs)
{ {
GtkComboBoxPrivate *priv;
g_return_if_fail (GTK_IS_COMBO_BOX (combo_box)); g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
priv = combo_box->priv;
add_tearoffs = add_tearoffs != FALSE; add_tearoffs = add_tearoffs != FALSE;
if (combo_box->priv->add_tearoffs != add_tearoffs) if (priv->add_tearoffs != add_tearoffs)
{ {
combo_box->priv->add_tearoffs = add_tearoffs; priv->add_tearoffs = add_tearoffs;
gtk_combo_box_check_appearance (combo_box); gtk_combo_box_check_appearance (combo_box);
if (GTK_IS_TREE_MENU (combo_box->priv->popup_widget)) if (GTK_IS_TREE_MENU (priv->popup_widget))
_gtk_tree_menu_set_tearoff (GTK_TREE_MENU (combo_box->priv->popup_widget), _gtk_tree_menu_set_tearoff (GTK_TREE_MENU (priv->popup_widget),
combo_box->priv->add_tearoffs); priv->add_tearoffs);
g_object_notify (G_OBJECT (combo_box), "add-tearoffs"); g_object_notify (G_OBJECT (combo_box), "add-tearoffs");
} }
@ -4615,13 +4631,15 @@ gtk_combo_box_get_title (GtkComboBox *combo_box)
static void static void
gtk_combo_box_update_title (GtkComboBox *combo_box) gtk_combo_box_update_title (GtkComboBox *combo_box)
{ {
GtkComboBoxPrivate *priv = combo_box->priv;
gtk_combo_box_check_appearance (combo_box); gtk_combo_box_check_appearance (combo_box);
if (combo_box->priv->popup_widget && if (priv->popup_widget &&
GTK_IS_MENU (combo_box->priv->popup_widget)) GTK_IS_MENU (priv->popup_widget))
G_GNUC_BEGIN_IGNORE_DEPRECATIONS; G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
gtk_menu_set_title (GTK_MENU (combo_box->priv->popup_widget), gtk_menu_set_title (GTK_MENU (priv->popup_widget),
combo_box->priv->tearoff_title); priv->tearoff_title);
G_GNUC_END_IGNORE_DEPRECATIONS; G_GNUC_END_IGNORE_DEPRECATIONS;
} }
@ -4673,11 +4691,15 @@ void
gtk_combo_box_set_popup_fixed_width (GtkComboBox *combo_box, gtk_combo_box_set_popup_fixed_width (GtkComboBox *combo_box,
gboolean fixed) gboolean fixed)
{ {
GtkComboBoxPrivate *priv;
g_return_if_fail (GTK_IS_COMBO_BOX (combo_box)); g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
if (combo_box->priv->popup_fixed_width != fixed) priv = combo_box->priv;
if (priv->popup_fixed_width != fixed)
{ {
combo_box->priv->popup_fixed_width = fixed; priv->popup_fixed_width = fixed;
g_object_notify (G_OBJECT (combo_box), "popup-fixed-width"); g_object_notify (G_OBJECT (combo_box), "popup-fixed-width");
} }
@ -4720,13 +4742,16 @@ gtk_combo_box_get_popup_fixed_width (GtkComboBox *combo_box)
AtkObject* AtkObject*
gtk_combo_box_get_popup_accessible (GtkComboBox *combo_box) gtk_combo_box_get_popup_accessible (GtkComboBox *combo_box)
{ {
GtkComboBoxPrivate *priv;
AtkObject *atk_obj; AtkObject *atk_obj;
g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), NULL); g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), NULL);
if (combo_box->priv->popup_widget) priv = combo_box->priv;
if (priv->popup_widget)
{ {
atk_obj = gtk_widget_get_accessible (combo_box->priv->popup_widget); atk_obj = gtk_widget_get_accessible (priv->popup_widget);
return atk_obj; return atk_obj;
} }
@ -4770,26 +4795,30 @@ gtk_combo_box_set_row_separator_func (GtkComboBox *combo_box,
gpointer data, gpointer data,
GDestroyNotify destroy) GDestroyNotify destroy)
{ {
GtkComboBoxPrivate *priv;
g_return_if_fail (GTK_IS_COMBO_BOX (combo_box)); g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
if (combo_box->priv->row_separator_destroy) priv = combo_box->priv;
combo_box->priv->row_separator_destroy (combo_box->priv->row_separator_data);
combo_box->priv->row_separator_func = func; if (priv->row_separator_destroy)
combo_box->priv->row_separator_data = data; priv->row_separator_destroy (priv->row_separator_data);
combo_box->priv->row_separator_destroy = destroy;
priv->row_separator_func = func;
priv->row_separator_data = data;
priv->row_separator_destroy = destroy;
/* Provoke the underlying treeview/menu to rebuild themselves with the new separator func */ /* Provoke the underlying treeview/menu to rebuild themselves with the new separator func */
if (combo_box->priv->tree_view) if (priv->tree_view)
{ {
gtk_tree_view_set_model (GTK_TREE_VIEW (combo_box->priv->tree_view), NULL); gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), NULL);
gtk_tree_view_set_model (GTK_TREE_VIEW (combo_box->priv->tree_view), combo_box->priv->model); gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), priv->model);
} }
if (GTK_IS_TREE_MENU (combo_box->priv->popup_widget)) if (GTK_IS_TREE_MENU (priv->popup_widget))
{ {
_gtk_tree_menu_set_model (GTK_TREE_MENU (combo_box->priv->popup_widget), NULL); _gtk_tree_menu_set_model (GTK_TREE_MENU (priv->popup_widget), NULL);
_gtk_tree_menu_set_model (GTK_TREE_MENU (combo_box->priv->popup_widget), combo_box->priv->model); _gtk_tree_menu_set_model (GTK_TREE_MENU (priv->popup_widget), priv->model);
} }
gtk_widget_queue_draw (GTK_WIDGET (combo_box)); gtk_widget_queue_draw (GTK_WIDGET (combo_box));
@ -4810,11 +4839,15 @@ void
gtk_combo_box_set_button_sensitivity (GtkComboBox *combo_box, gtk_combo_box_set_button_sensitivity (GtkComboBox *combo_box,
GtkSensitivityType sensitivity) GtkSensitivityType sensitivity)
{ {
GtkComboBoxPrivate *priv;
g_return_if_fail (GTK_IS_COMBO_BOX (combo_box)); g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
if (combo_box->priv->button_sensitivity != sensitivity) priv = combo_box->priv;
if (priv->button_sensitivity != sensitivity)
{ {
combo_box->priv->button_sensitivity = sensitivity; priv->button_sensitivity = sensitivity;
gtk_combo_box_update_sensitivity (combo_box); gtk_combo_box_update_sensitivity (combo_box);
g_object_notify (G_OBJECT (combo_box), "button-sensitivity"); g_object_notify (G_OBJECT (combo_box), "button-sensitivity");
@ -5142,11 +5175,13 @@ void
gtk_combo_box_set_id_column (GtkComboBox *combo_box, gtk_combo_box_set_id_column (GtkComboBox *combo_box,
gint id_column) gint id_column)
{ {
GtkComboBoxPrivate *priv = combo_box->priv; GtkComboBoxPrivate *priv;
GtkTreeModel *model; GtkTreeModel *model;
g_return_if_fail (GTK_IS_COMBO_BOX (combo_box)); g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
priv = combo_box->priv;
if (id_column != priv->id_column) if (id_column != priv->id_column)
{ {
model = gtk_combo_box_get_model (combo_box); model = gtk_combo_box_get_model (combo_box);