Don't call g_signal_handler_disonnect() if priv->model is NULL. (#136551,

Mon Mar  8 11:57:27 2004  Owen Taylor  <otaylor@redhat.com>

        * gtk/gtkcombobox.c (gtk_combo_box_unset_model): Don't
        call g_signal_handler_disonnect() if priv->model is
        NULL. (#136551, Damon Chaplin)

        * gtk/gtkcombobox.c (gtk_combo_box_model_row_inserted):
        Back out code to set the active item when the first
        item is added to the model; this causes problems for
        GtkComboBoxText. (#136535)

        * gtk/gtkcombobox.c (gtk_combo_box_menu_destroy)
        * gtk/gtkcombobox.c (gtk_combo_box_list_destroy):
        * gtk/gtkcombobox.c (gtk_combo_box_list_setup):
        * gtk/gtkcombobox.c (gtk_combo_box_menu_setup):
        Remove calls to gtk_combo_box_unset_model.

        * gtk/gtkcombobox.c (gtk_combo_box_check_appearance):
        Clean up handling of wrap->width > 0.

        * gtk/gtkcombobox.c (gtk_combo_box_relayout): Don't
        switch list/menu mode here.

        * gtk/gtkcombobox.c (gtk_combo_box_set_model): Protect
        against the same model being set back.

        * gtk/gtkcombobox.c (gtk_combo_box_relayout): Call
        gtk_combo_box_menu_fill() rather than duplicating
        a large chunk of code.
This commit is contained in:
Owen Taylor 2004-03-08 18:39:44 +00:00 committed by Owen Taylor
parent 44155e1313
commit 5ac8b12808
6 changed files with 223 additions and 127 deletions

View File

@ -1,3 +1,33 @@
Mon Mar 8 11:57:27 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkcombobox.c (gtk_combo_box_unset_model): Don't
call g_signal_handler_disonnect() if priv->model is
NULL. (#136551, Damon Chaplin)
* gtk/gtkcombobox.c (gtk_combo_box_model_row_inserted):
Back out code to set the active item when the first
item is added to the model; this causes problems for
GtkComboBoxText. (#136535)
* gtk/gtkcombobox.c (gtk_combo_box_menu_destroy)
* gtk/gtkcombobox.c (gtk_combo_box_list_destroy):
* gtk/gtkcombobox.c (gtk_combo_box_list_setup):
* gtk/gtkcombobox.c (gtk_combo_box_menu_setup):
Remove calls to gtk_combo_box_unset_model.
* gtk/gtkcombobox.c (gtk_combo_box_check_appearance):
Clean up handling of wrap->width > 0.
* gtk/gtkcombobox.c (gtk_combo_box_relayout): Don't
switch list/menu mode here.
* gtk/gtkcombobox.c (gtk_combo_box_set_model): Protect
against the same model being set back.
* gtk/gtkcombobox.c (gtk_combo_box_relayout): Call
gtk_combo_box_menu_fill() rather than duplicating
a large chunk of code.
2004-03-08 Anders Carlsson <andersca@gnome.org> 2004-03-08 Anders Carlsson <andersca@gnome.org>
* gtk/gtkfilesystemmodel.c (gtk_file_system_model_get_flags): * gtk/gtkfilesystemmodel.c (gtk_file_system_model_get_flags):

View File

@ -1,3 +1,33 @@
Mon Mar 8 11:57:27 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkcombobox.c (gtk_combo_box_unset_model): Don't
call g_signal_handler_disonnect() if priv->model is
NULL. (#136551, Damon Chaplin)
* gtk/gtkcombobox.c (gtk_combo_box_model_row_inserted):
Back out code to set the active item when the first
item is added to the model; this causes problems for
GtkComboBoxText. (#136535)
* gtk/gtkcombobox.c (gtk_combo_box_menu_destroy)
* gtk/gtkcombobox.c (gtk_combo_box_list_destroy):
* gtk/gtkcombobox.c (gtk_combo_box_list_setup):
* gtk/gtkcombobox.c (gtk_combo_box_menu_setup):
Remove calls to gtk_combo_box_unset_model.
* gtk/gtkcombobox.c (gtk_combo_box_check_appearance):
Clean up handling of wrap->width > 0.
* gtk/gtkcombobox.c (gtk_combo_box_relayout): Don't
switch list/menu mode here.
* gtk/gtkcombobox.c (gtk_combo_box_set_model): Protect
against the same model being set back.
* gtk/gtkcombobox.c (gtk_combo_box_relayout): Call
gtk_combo_box_menu_fill() rather than duplicating
a large chunk of code.
2004-03-08 Anders Carlsson <andersca@gnome.org> 2004-03-08 Anders Carlsson <andersca@gnome.org>
* gtk/gtkfilesystemmodel.c (gtk_file_system_model_get_flags): * gtk/gtkfilesystemmodel.c (gtk_file_system_model_get_flags):

View File

@ -1,3 +1,33 @@
Mon Mar 8 11:57:27 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkcombobox.c (gtk_combo_box_unset_model): Don't
call g_signal_handler_disonnect() if priv->model is
NULL. (#136551, Damon Chaplin)
* gtk/gtkcombobox.c (gtk_combo_box_model_row_inserted):
Back out code to set the active item when the first
item is added to the model; this causes problems for
GtkComboBoxText. (#136535)
* gtk/gtkcombobox.c (gtk_combo_box_menu_destroy)
* gtk/gtkcombobox.c (gtk_combo_box_list_destroy):
* gtk/gtkcombobox.c (gtk_combo_box_list_setup):
* gtk/gtkcombobox.c (gtk_combo_box_menu_setup):
Remove calls to gtk_combo_box_unset_model.
* gtk/gtkcombobox.c (gtk_combo_box_check_appearance):
Clean up handling of wrap->width > 0.
* gtk/gtkcombobox.c (gtk_combo_box_relayout): Don't
switch list/menu mode here.
* gtk/gtkcombobox.c (gtk_combo_box_set_model): Protect
against the same model being set back.
* gtk/gtkcombobox.c (gtk_combo_box_relayout): Call
gtk_combo_box_menu_fill() rather than duplicating
a large chunk of code.
2004-03-08 Anders Carlsson <andersca@gnome.org> 2004-03-08 Anders Carlsson <andersca@gnome.org>
* gtk/gtkfilesystemmodel.c (gtk_file_system_model_get_flags): * gtk/gtkfilesystemmodel.c (gtk_file_system_model_get_flags):

View File

@ -1,3 +1,33 @@
Mon Mar 8 11:57:27 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkcombobox.c (gtk_combo_box_unset_model): Don't
call g_signal_handler_disonnect() if priv->model is
NULL. (#136551, Damon Chaplin)
* gtk/gtkcombobox.c (gtk_combo_box_model_row_inserted):
Back out code to set the active item when the first
item is added to the model; this causes problems for
GtkComboBoxText. (#136535)
* gtk/gtkcombobox.c (gtk_combo_box_menu_destroy)
* gtk/gtkcombobox.c (gtk_combo_box_list_destroy):
* gtk/gtkcombobox.c (gtk_combo_box_list_setup):
* gtk/gtkcombobox.c (gtk_combo_box_menu_setup):
Remove calls to gtk_combo_box_unset_model.
* gtk/gtkcombobox.c (gtk_combo_box_check_appearance):
Clean up handling of wrap->width > 0.
* gtk/gtkcombobox.c (gtk_combo_box_relayout): Don't
switch list/menu mode here.
* gtk/gtkcombobox.c (gtk_combo_box_set_model): Protect
against the same model being set back.
* gtk/gtkcombobox.c (gtk_combo_box_relayout): Call
gtk_combo_box_menu_fill() rather than duplicating
a large chunk of code.
2004-03-08 Anders Carlsson <andersca@gnome.org> 2004-03-08 Anders Carlsson <andersca@gnome.org>
* gtk/gtkfilesystemmodel.c (gtk_file_system_model_get_flags): * gtk/gtkfilesystemmodel.c (gtk_file_system_model_get_flags):

View File

@ -1,3 +1,33 @@
Mon Mar 8 11:57:27 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkcombobox.c (gtk_combo_box_unset_model): Don't
call g_signal_handler_disonnect() if priv->model is
NULL. (#136551, Damon Chaplin)
* gtk/gtkcombobox.c (gtk_combo_box_model_row_inserted):
Back out code to set the active item when the first
item is added to the model; this causes problems for
GtkComboBoxText. (#136535)
* gtk/gtkcombobox.c (gtk_combo_box_menu_destroy)
* gtk/gtkcombobox.c (gtk_combo_box_list_destroy):
* gtk/gtkcombobox.c (gtk_combo_box_list_setup):
* gtk/gtkcombobox.c (gtk_combo_box_menu_setup):
Remove calls to gtk_combo_box_unset_model.
* gtk/gtkcombobox.c (gtk_combo_box_check_appearance):
Clean up handling of wrap->width > 0.
* gtk/gtkcombobox.c (gtk_combo_box_relayout): Don't
switch list/menu mode here.
* gtk/gtkcombobox.c (gtk_combo_box_set_model): Protect
against the same model being set back.
* gtk/gtkcombobox.c (gtk_combo_box_relayout): Call
gtk_combo_box_menu_fill() rather than duplicating
a large chunk of code.
2004-03-08 Anders Carlsson <andersca@gnome.org> 2004-03-08 Anders Carlsson <andersca@gnome.org>
* gtk/gtkfilesystemmodel.c (gtk_file_system_model_get_flags): * gtk/gtkfilesystemmodel.c (gtk_file_system_model_get_flags):

View File

@ -231,7 +231,6 @@ static gint gtk_combo_box_calc_requested_width (GtkComboBox *combo_box,
static void gtk_combo_box_remeasure (GtkComboBox *combo_box); static void gtk_combo_box_remeasure (GtkComboBox *combo_box);
static void gtk_combo_box_unset_model (GtkComboBox *combo_box); static void gtk_combo_box_unset_model (GtkComboBox *combo_box);
static void gtk_combo_box_set_model_internal (GtkComboBox *combo_box);
static void gtk_combo_box_size_request (GtkWidget *widget, static void gtk_combo_box_size_request (GtkWidget *widget,
GtkRequisition *requisition); GtkRequisition *requisition);
@ -297,7 +296,7 @@ static void gtk_combo_box_list_row_changed (GtkTreeModel *model,
/* menu */ /* menu */
static void gtk_combo_box_menu_setup (GtkComboBox *combo_box, static void gtk_combo_box_menu_setup (GtkComboBox *combo_box,
gboolean add_childs); gboolean add_children);
static void gtk_combo_box_menu_fill (GtkComboBox *combo_box); static void gtk_combo_box_menu_fill (GtkComboBox *combo_box);
static void gtk_combo_box_menu_destroy (GtkComboBox *combo_box); static void gtk_combo_box_menu_destroy (GtkComboBox *combo_box);
@ -621,23 +620,19 @@ gtk_combo_box_state_changed (GtkWidget *widget,
} }
static void static void
gtk_combo_box_style_set (GtkWidget *widget, gtk_combo_box_check_appearance (GtkComboBox *combo_box)
GtkStyle *previous)
{ {
gboolean appears_as_list; gboolean appears_as_list;
GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
gtk_widget_queue_resize (widget);
/* if wrap_width > 0, then we are in grid-mode and forced to use /* if wrap_width > 0, then we are in grid-mode and forced to use
* unix style * unix style
*/ */
if (combo_box->priv->wrap_width) if (combo_box->priv->wrap_width)
return; appears_as_list = FALSE;
else
gtk_widget_style_get (widget, gtk_widget_style_get (GTK_WIDGET (combo_box),
"appears-as-list", &appears_as_list, "appears-as-list", &appears_as_list,
NULL); NULL);
if (appears_as_list) if (appears_as_list)
{ {
@ -659,11 +654,19 @@ gtk_combo_box_style_set (GtkWidget *widget,
if (!GTK_IS_MENU (combo_box->priv->popup_widget)) if (!GTK_IS_MENU (combo_box->priv->popup_widget))
gtk_combo_box_menu_setup (combo_box, TRUE); gtk_combo_box_menu_setup (combo_box, TRUE);
} }
}
static void
gtk_combo_box_style_set (GtkWidget *widget,
GtkStyle *previous)
{
GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
gtk_combo_box_check_appearance (combo_box);
if (combo_box->priv->tree_view && combo_box->priv->cell_view) if (combo_box->priv->tree_view && combo_box->priv->cell_view)
gtk_cell_view_set_background_color (GTK_CELL_VIEW (combo_box->priv->cell_view), gtk_cell_view_set_background_color (GTK_CELL_VIEW (combo_box->priv->cell_view),
&widget->style->base[GTK_WIDGET_STATE (widget)]); &widget->style->base[GTK_WIDGET_STATE (widget)]);
} }
static void static void
@ -1297,7 +1300,7 @@ gtk_combo_box_size_allocate (GtkWidget *widget,
width = allocation->width - (border_width + 1 + xthickness * 2 + 4); width = allocation->width - (border_width + 1 + xthickness * 2 + 4);
/* handle the childs */ /* handle the children */
gtk_widget_size_request (combo_box->priv->arrow, &req); gtk_widget_size_request (combo_box->priv->arrow, &req);
child.width = req.width; child.width = req.width;
child.height = allocation->height - 2 * (child.y - allocation->y); child.height = allocation->height - 2 * (child.y - allocation->y);
@ -1398,29 +1401,16 @@ gtk_combo_box_size_allocate (GtkWidget *widget,
static void static void
gtk_combo_box_unset_model (GtkComboBox *combo_box) gtk_combo_box_unset_model (GtkComboBox *combo_box)
{ {
if (combo_box->priv->inserted_id != -1) if (combo_box->priv->model)
{ {
g_signal_handler_disconnect (combo_box->priv->model, g_signal_handler_disconnect (combo_box->priv->model,
combo_box->priv->inserted_id); combo_box->priv->inserted_id);
combo_box->priv->inserted_id = -1;
}
if (combo_box->priv->deleted_id != -1)
{
g_signal_handler_disconnect (combo_box->priv->model, g_signal_handler_disconnect (combo_box->priv->model,
combo_box->priv->deleted_id); combo_box->priv->deleted_id);
combo_box->priv->deleted_id = -1;
}
if (combo_box->priv->reordered_id != -1)
{
g_signal_handler_disconnect (combo_box->priv->model, g_signal_handler_disconnect (combo_box->priv->model,
combo_box->priv->reordered_id); combo_box->priv->reordered_id);
combo_box->priv->reordered_id = -1;
}
if (combo_box->priv->changed_id != -1)
{
g_signal_handler_disconnect (combo_box->priv->model, g_signal_handler_disconnect (combo_box->priv->model,
combo_box->priv->changed_id); combo_box->priv->changed_id);
combo_box->priv->changed_id = -1;
} }
/* menu mode */ /* menu mode */
@ -1430,34 +1420,9 @@ gtk_combo_box_unset_model (GtkComboBox *combo_box)
gtk_container_foreach (GTK_CONTAINER (combo_box->priv->popup_widget), gtk_container_foreach (GTK_CONTAINER (combo_box->priv->popup_widget),
(GtkCallback)gtk_widget_destroy, NULL); (GtkCallback)gtk_widget_destroy, NULL);
} }
}
static void g_object_unref (G_OBJECT (combo_box->priv->model));
gtk_combo_box_set_model_internal (GtkComboBox *combo_box) combo_box->priv->model = NULL;
{
combo_box->priv->inserted_id =
g_signal_connect (combo_box->priv->model, "row_inserted",
G_CALLBACK (gtk_combo_box_model_row_inserted),
combo_box);
combo_box->priv->deleted_id =
g_signal_connect (combo_box->priv->model, "row_deleted",
G_CALLBACK (gtk_combo_box_model_row_deleted),
combo_box);
combo_box->priv->reordered_id =
g_signal_connect (combo_box->priv->model, "rows_reordered",
G_CALLBACK (gtk_combo_box_model_rows_reordered),
combo_box);
combo_box->priv->changed_id =
g_signal_connect (combo_box->priv->model, "row_changed",
G_CALLBACK (gtk_combo_box_model_row_changed),
combo_box);
if (combo_box->priv->tree_view)
{
/* list mode */
gtk_tree_view_set_model (GTK_TREE_VIEW (combo_box->priv->tree_view),
combo_box->priv->model);
}
} }
static void static void
@ -1584,13 +1549,10 @@ cell_view_sync_cells (GtkComboBox *combo_box,
static void static void
gtk_combo_box_menu_setup (GtkComboBox *combo_box, gtk_combo_box_menu_setup (GtkComboBox *combo_box,
gboolean add_childs) gboolean add_children)
{ {
GtkWidget *box; GtkWidget *box;
/* Unset any existing model. */
gtk_combo_box_unset_model (combo_box);
if (combo_box->priv->cell_view) if (combo_box->priv->cell_view)
{ {
combo_box->priv->button = gtk_toggle_button_new (); combo_box->priv->button = gtk_toggle_button_new ();
@ -1645,11 +1607,8 @@ gtk_combo_box_menu_setup (GtkComboBox *combo_box,
G_CALLBACK (gtk_combo_box_menu_key_press), combo_box); G_CALLBACK (gtk_combo_box_menu_key_press), combo_box);
gtk_combo_box_set_popup_widget (combo_box, box); gtk_combo_box_set_popup_widget (combo_box, box);
/* set the models */
gtk_combo_box_set_model_internal (combo_box);
/* add items */ /* add items */
if (add_childs) if (add_children)
gtk_combo_box_menu_fill (combo_box); gtk_combo_box_menu_fill (combo_box);
} }
@ -1682,6 +1641,10 @@ gtk_combo_box_menu_fill (GtkComboBox *combo_box)
GTK_CELL_VIEW (GTK_BIN (tmp)->child)); GTK_CELL_VIEW (GTK_BIN (tmp)->child));
gtk_menu_shell_append (GTK_MENU_SHELL (menu), tmp); gtk_menu_shell_append (GTK_MENU_SHELL (menu), tmp);
if (combo_box->priv->wrap_width)
gtk_combo_box_relayout_item (combo_box, i);
gtk_widget_show (tmp); gtk_widget_show (tmp);
gtk_tree_path_free (path); gtk_tree_path_free (path);
@ -1691,9 +1654,6 @@ gtk_combo_box_menu_fill (GtkComboBox *combo_box)
static void static void
gtk_combo_box_menu_destroy (GtkComboBox *combo_box) gtk_combo_box_menu_destroy (GtkComboBox *combo_box)
{ {
/* disconnect signal handlers */
gtk_combo_box_unset_model (combo_box);
g_signal_handlers_disconnect_matched (combo_box->priv->button, g_signal_handlers_disconnect_matched (combo_box->priv->button,
G_SIGNAL_MATCH_DATA, G_SIGNAL_MATCH_DATA,
0, 0, NULL, 0, 0, NULL,
@ -1720,7 +1680,7 @@ gtk_combo_box_menu_destroy (GtkComboBox *combo_box)
combo_box->priv->arrow = NULL; combo_box->priv->arrow = NULL;
} }
/* changing the popup window will unref the menu and the childs */ /* changing the popup window will unref the menu and the children */
} }
/* /*
@ -1844,22 +1804,15 @@ gtk_combo_box_relayout_item (GtkComboBox *combo_box,
static void static void
gtk_combo_box_relayout (GtkComboBox *combo_box) gtk_combo_box_relayout (GtkComboBox *combo_box)
{ {
gint i, items;
GList *list, *j; GList *list, *j;
GtkWidget *menu; GtkWidget *menu;
/* ensure we are in menu style */ /* do nothing unless we are in menu style */
if (combo_box->priv->tree_view) if (combo_box->priv->tree_view)
gtk_combo_box_list_destroy (combo_box); return;
menu = combo_box->priv->popup_widget; menu = combo_box->priv->popup_widget;
if (!GTK_IS_MENU_SHELL (menu))
{
gtk_combo_box_menu_setup (combo_box, FALSE);
menu = combo_box->priv->popup_widget;
}
/* get rid of all children */ /* get rid of all children */
g_return_if_fail (GTK_IS_MENU_SHELL (menu)); g_return_if_fail (GTK_IS_MENU_SHELL (menu));
@ -1871,32 +1824,7 @@ gtk_combo_box_relayout (GtkComboBox *combo_box)
g_list_free (list); g_list_free (list);
/* and relayout */ /* and relayout */
items = gtk_tree_model_iter_n_children (combo_box->priv->model, NULL); gtk_combo_box_menu_fill (combo_box);
for (i = 0; i < items; i++)
{
GtkWidget *tmp;
GtkTreePath *path;
path = gtk_tree_path_new_from_indices (i, -1);
tmp = gtk_cell_view_menu_item_new_from_model (combo_box->priv->model,
path);
g_signal_connect (tmp, "activate",
G_CALLBACK (gtk_combo_box_menu_item_activate),
combo_box);
cell_view_sync_cells (combo_box, GTK_CELL_VIEW (GTK_BIN (tmp)->child));
gtk_menu_shell_insert (GTK_MENU_SHELL (menu), tmp, i);
if (combo_box->priv->wrap_width)
gtk_combo_box_relayout_item (combo_box, i);
gtk_widget_show (tmp);
gtk_tree_path_free (path);
}
} }
/* callbacks */ /* callbacks */
@ -1952,16 +1880,12 @@ gtk_combo_box_model_row_inserted (GtkTreeModel *model,
{ {
GtkComboBox *combo_box = GTK_COMBO_BOX (user_data); GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
gint index = gtk_tree_path_get_indices (path)[0]; gint index = gtk_tree_path_get_indices (path)[0];
gint items = gtk_tree_model_iter_n_children (model, NULL);
if (combo_box->priv->active_item >= index) if (combo_box->priv->active_item >= index)
combo_box->priv->active_item++; combo_box->priv->active_item++;
if (!combo_box->priv->tree_view) if (!combo_box->priv->tree_view)
gtk_combo_box_menu_row_inserted (model, path, iter, user_data); gtk_combo_box_menu_row_inserted (model, path, iter, user_data);
if (items == 1)
gtk_combo_box_set_active (combo_box, 0);
} }
static void static void
@ -2135,9 +2059,6 @@ gtk_combo_box_list_setup (GtkComboBox *combo_box)
GSList *i; GSList *i;
GtkTreeSelection *sel; GtkTreeSelection *sel;
/* Unset any existing model. */
gtk_combo_box_unset_model (combo_box);
combo_box->priv->button = gtk_toggle_button_new (); combo_box->priv->button = gtk_toggle_button_new ();
gtk_widget_set_parent (combo_box->priv->button, gtk_widget_set_parent (combo_box->priv->button,
GTK_BIN (combo_box)->child->parent); GTK_BIN (combo_box)->child->parent);
@ -2173,6 +2094,9 @@ gtk_combo_box_list_setup (GtkComboBox *combo_box)
gtk_tree_selection_set_mode (sel, GTK_SELECTION_SINGLE); gtk_tree_selection_set_mode (sel, GTK_SELECTION_SINGLE);
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (combo_box->priv->tree_view), gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (combo_box->priv->tree_view),
FALSE); FALSE);
if (combo_box->priv->model)
gtk_tree_view_set_model (GTK_TREE_VIEW (combo_box->priv->tree_view),
combo_box->priv->model);
g_signal_connect (combo_box->priv->tree_view, "button_press_event", g_signal_connect (combo_box->priv->tree_view, "button_press_event",
G_CALLBACK (gtk_combo_box_list_button_pressed), G_CALLBACK (gtk_combo_box_list_button_pressed),
@ -2188,9 +2112,6 @@ gtk_combo_box_list_setup (GtkComboBox *combo_box)
gtk_tree_view_append_column (GTK_TREE_VIEW (combo_box->priv->tree_view), gtk_tree_view_append_column (GTK_TREE_VIEW (combo_box->priv->tree_view),
combo_box->priv->column); combo_box->priv->column);
/* set the models */
gtk_combo_box_set_model_internal (combo_box);
/* sync up */ /* sync up */
for (i = combo_box->priv->cells; i; i = i->next) for (i = combo_box->priv->cells; i; i = i->next)
{ {
@ -2236,8 +2157,6 @@ static void
gtk_combo_box_list_destroy (GtkComboBox *combo_box) gtk_combo_box_list_destroy (GtkComboBox *combo_box)
{ {
/* disconnect signals */ /* disconnect signals */
gtk_combo_box_unset_model (combo_box);
g_signal_handlers_disconnect_matched (combo_box->priv->tree_view, g_signal_handlers_disconnect_matched (combo_box->priv->tree_view,
G_SIGNAL_MATCH_DATA, G_SIGNAL_MATCH_DATA,
0, 0, NULL, NULL, combo_box); 0, 0, NULL, NULL, combo_box);
@ -2954,8 +2873,8 @@ gtk_combo_box_set_wrap_width (GtkComboBox *combo_box,
{ {
combo_box->priv->wrap_width = width; combo_box->priv->wrap_width = width;
gtk_combo_box_check_appearance (combo_box);
gtk_combo_box_relayout (combo_box); gtk_combo_box_relayout (combo_box);
gtk_combo_box_style_set (GTK_WIDGET (combo_box), NULL);
g_object_notify (G_OBJECT (combo_box), "wrap_width"); g_object_notify (G_OBJECT (combo_box), "wrap_width");
} }
@ -3192,18 +3111,45 @@ gtk_combo_box_set_model (GtkComboBox *combo_box,
g_return_if_fail (GTK_IS_COMBO_BOX (combo_box)); g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
g_return_if_fail (GTK_IS_TREE_MODEL (model)); g_return_if_fail (GTK_IS_TREE_MODEL (model));
if (model == combo_box->priv->model)
return;
if (combo_box->priv->model) if (combo_box->priv->model)
{ gtk_combo_box_unset_model (combo_box);
gtk_combo_box_unset_model (combo_box);
g_object_unref (G_OBJECT (combo_box->priv->model));
}
combo_box->priv->model = model; combo_box->priv->model = model;
g_object_ref (G_OBJECT (combo_box->priv->model)); g_object_ref (G_OBJECT (combo_box->priv->model));
gtk_combo_box_set_model_internal (combo_box); combo_box->priv->inserted_id =
if (!combo_box->priv->tree_view && combo_box->priv->popup_widget) g_signal_connect (combo_box->priv->model, "row_inserted",
gtk_combo_box_menu_fill (combo_box); G_CALLBACK (gtk_combo_box_model_row_inserted),
combo_box);
combo_box->priv->deleted_id =
g_signal_connect (combo_box->priv->model, "row_deleted",
G_CALLBACK (gtk_combo_box_model_row_deleted),
combo_box);
combo_box->priv->reordered_id =
g_signal_connect (combo_box->priv->model, "rows_reordered",
G_CALLBACK (gtk_combo_box_model_rows_reordered),
combo_box);
combo_box->priv->changed_id =
g_signal_connect (combo_box->priv->model, "row_changed",
G_CALLBACK (gtk_combo_box_model_row_changed),
combo_box);
if (combo_box->priv->tree_view)
{
/* list mode */
gtk_tree_view_set_model (GTK_TREE_VIEW (combo_box->priv->tree_view),
combo_box->priv->model);
}
else
{
/* menu mode */
if (combo_box->priv->popup_widget)
gtk_combo_box_menu_fill (combo_box);
}
if (combo_box->priv->cell_view) if (combo_box->priv->cell_view)
gtk_cell_view_set_model (GTK_CELL_VIEW (combo_box->priv->cell_view), gtk_cell_view_set_model (GTK_CELL_VIEW (combo_box->priv->cell_view),
@ -3408,8 +3354,6 @@ gtk_combo_box_finalize (GObject *object)
GtkComboBox *combo_box = GTK_COMBO_BOX (object); GtkComboBox *combo_box = GTK_COMBO_BOX (object);
GSList *i; GSList *i;
gtk_combo_box_unset_model (combo_box);
if (GTK_IS_MENU (combo_box->priv->popup_widget)) if (GTK_IS_MENU (combo_box->priv->popup_widget))
gtk_combo_box_menu_destroy (combo_box); gtk_combo_box_menu_destroy (combo_box);
@ -3419,6 +3363,8 @@ gtk_combo_box_finalize (GObject *object)
if (combo_box->priv->popup_window) if (combo_box->priv->popup_window)
gtk_widget_destroy (combo_box->priv->popup_window); gtk_widget_destroy (combo_box->priv->popup_window);
gtk_combo_box_unset_model (combo_box);
if (combo_box->priv->model) if (combo_box->priv->model)
g_object_unref (combo_box->priv->model); g_object_unref (combo_box->priv->model);