# HG changeset patch # User Olaf Wintermann # Date 1730199085 -3600 # Node ID 9e19ac687b9f06b07d4334afb71f2af67497e965 # Parent 94144a948affd5989559f618cc5b0ceae889391f fix crash when closing the preferences window (GTK3) diff -r 94144a948aff -r 9e19ac687b9f ui/gtk/list.c --- a/ui/gtk/list.c Tue Oct 29 11:25:00 2024 +0100 +++ b/ui/gtk/list.c Tue Oct 29 11:51:25 2024 +0100 @@ -171,7 +171,7 @@ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); #ifdef UI_GTK3 #if GTK_MINOR_VERSION >= 8 - gtk_tree_view_set_activate_on_single_click(GTK_TREE_VIEW(view), TRUE); + //gtk_tree_view_set_activate_on_single_click(GTK_TREE_VIEW(view), TRUE); #else // TODO: implement for older gtk3 #endif @@ -187,6 +187,7 @@ UiList *list = var ? var->value : NULL; GtkListStore *listmodel = create_list_store(list, model); gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(listmodel)); + g_object_unref(listmodel); UiListView *listview = malloc(sizeof(UiListView)); listview->obj = obj; @@ -340,6 +341,7 @@ UiList *list = var ? var->value : NULL; GtkListStore *listmodel = create_list_store(list, model); gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(listmodel)); + g_object_unref(listmodel); //g_signal_connect(view, "drag-begin", G_CALLBACK(drag_begin), NULL); //g_signal_connect(view, "drag-end", G_CALLBACK(drag_end), NULL); @@ -498,7 +500,6 @@ GtkListStore *store = create_list_store(list, view->model); gtk_tree_view_set_model(GTK_TREE_VIEW(view->widget), GTK_TREE_MODEL(store)); g_object_unref(G_OBJECT(store)); - // TODO: free old model } UiListSelection ui_listview_getselection(UiList *list) { @@ -518,16 +519,13 @@ } void ui_listview_destroy(GtkWidget *w, UiListView *v) { - gtk_tree_view_set_model(GTK_TREE_VIEW(w), NULL); + //gtk_tree_view_set_model(GTK_TREE_VIEW(w), NULL); ui_destroy_boundvar(v->obj->ctx, v->var); - // TODO: destroy model? free(v); } void ui_combobox_destroy(GtkWidget *w, UiListView *v) { - gtk_combo_box_set_model(GTK_COMBO_BOX(w), NULL); ui_destroy_boundvar(v->obj->ctx, v->var); - // TODO: destroy model? free(v); } @@ -636,6 +634,7 @@ if(listmodel) { gtk_combo_box_set_model(GTK_COMBO_BOX(combobox), GTK_TREE_MODEL(listmodel)); + g_object_unref(listmodel); } uicbox->var = var; @@ -698,6 +697,7 @@ UiListView *view = list->obj; GtkListStore *store = create_list_store(view->var->value, view->model); gtk_combo_box_set_model(GTK_COMBO_BOX(view->widget), GTK_TREE_MODEL(store)); + g_object_unref(store); } UiListSelection ui_combobox_getselection(UiList *list) { diff -r 94144a948aff -r 9e19ac687b9f ui/gtk/window.c --- a/ui/gtk/window.c Tue Oct 29 11:25:00 2024 +0100 +++ b/ui/gtk/window.c Tue Oct 29 11:51:25 2024 +0100 @@ -49,7 +49,7 @@ static int window_default_width = 650; static int window_default_height = 550; -void ui_exit_event(GtkWidget *widget, gpointer data) { +static gboolean ui_window_destroy(void *data) { UiObject *obj = data; UiEvent ev; ev.window = obj->window; @@ -61,7 +61,8 @@ if(obj->ctx->close_callback) { obj->ctx->close_callback(&ev, obj->ctx->close_data); } - // TODO: free UiObject + + cxMempoolDestroy(obj->ctx->mp); nwindows--; #ifdef UI_GTK2 @@ -69,6 +70,14 @@ gtk_main_quit(); } #endif + + return FALSE; +} + +void ui_exit_event(GtkWidget *widget, gpointer data) { + // delay exit handler + UiObject *obj = data; + g_idle_add(ui_window_destroy, data); } #if GTK_MAJOR_VERSION >= 4