Господа... :)
Столкнулся с довольно неприятной проблемой. Суть ее сводится к тому, что
если в обработчике сигнала "changed" GtkTreeSelection выполнить
gtk_widget_destroy для GtkTreeView этого GtkTreeSelection'а, то приложение
падает с Segmentation fault'ом.
Насколько я понимаю, это происходит из-за того, что GTK после вызова
обработчика производит какие-то действия с
GtkTreeView/GtkTreeSelection/GtkTreeModel, а т. к. я уничтожаю GtkTreeView
в обработчике сигнала, то GTK обращается по старому указателю на уже
несуществующий объект. Может быть я что-то не так делаю? Подскажите
пожалуйста, как можно избежать данной ошибки.
Вот пример приложения, которое аварийно завершается, если щелкнуть мышью по строке
GtkTreeView:
#include <gtk/gtk.h>
GtkWidget *treeview;
void change_callback(GtkTreeSelection *treeselection, gpointer user_data)
{
gtk_widget_destroy(treeview);
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *vbox;
GtkTreeIter iter;
GtkTreeModel *items_model;
GtkCellRenderer *renderer;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
vbox = gtk_vbox_new(FALSE, 5);
gtk_container_add(GTK_CONTAINER(window), vbox);
items_model = GTK_TREE_MODEL(gtk_list_store_new(1, G_TYPE_INT));
gtk_list_store_append(GTK_LIST_STORE(items_model), &iter);
gtk_list_store_set(GTK_LIST_STORE(items_model), &iter, 0, 1, -1);
treeview = gtk_tree_view_new_with_model(items_model);
g_object_unref (items_model);
renderer = gtk_cell_renderer_combo_new();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), -1, "Name", renderer, "text", 0, NULL);
g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)))
, "changed", G_CALLBACK(change_callback), NULL);
gtk_box_pack_start(GTK_BOX(vbox), treeview, FALSE, FALSE, 0);
gtk_widget_show_all (window);
gtk_main();
}
>>>