--- a/ui/gtk/list.c Wed Jun 25 23:15:34 2025 +0200 +++ b/ui/gtk/list.c Thu Jun 26 18:28:20 2025 +0200 @@ -48,9 +48,9 @@ return column == 0 ? elm : NULL; } -static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col) { +static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col, UiBool *freeResult) { if(model->getvalue2) { - return model->getvalue2(list, elm, row, col, model->getvalue2data); + return model->getvalue2(list, elm, row, col, model->getvalue2data, freeResult); } else if(model->getvalue) { return model->getvalue(elm, col); } @@ -139,15 +139,15 @@ UiModel *model = col->listview->model; UiModelType type = model->types[col->model_column]; - void *data = model_getvalue(model, list, obj->data, obj->i, col->data_column); + UiBool freevalue = FALSE; + void *data = model_getvalue(model, list, obj->data, obj->i, col->data_column, &freevalue); GtkWidget *child = gtk_list_item_get_child(item); - bool freevalue = TRUE; switch(type) { + case UI_STRING_FREE: { + freevalue = TRUE; + } case UI_STRING: { - freevalue = FALSE; - } - case UI_STRING_FREE: { gtk_label_set_label(GTK_LABEL(child), data); if(freevalue) { free(data); @@ -169,10 +169,13 @@ break; } case UI_ICON_TEXT: { - freevalue = FALSE; + } case UI_ICON_TEXT_FREE: { - void *data2 = model_getvalue(model, list, obj->data, obj->i, col->data_column+1); + void *data2 = model_getvalue(model, list, obj->data, obj->i, col->data_column+1, &freevalue); + if(type == UI_ICON_TEXT_FREE) { + freevalue = TRUE; + } GtkWidget *image = g_object_get_data(G_OBJECT(child), "image"); GtkWidget *label = g_object_get_data(G_OBJECT(child), "label"); if(data && image) { @@ -691,15 +694,18 @@ // set column values int c = 0; for(int i=0;i<model->columns;i++,c++) { - void *data = model_getvalue(model, list, elm, row, c); + UiBool freevalue = FALSE; + void *data = model_getvalue(model, list, elm, row, c, &freevalue); GValue value = G_VALUE_INIT; switch(model->types[i]) { - case UI_STRING: case UI_STRING_FREE: { + freevalue = TRUE; + } + case UI_STRING: { g_value_init(&value, G_TYPE_STRING); g_value_set_string(&value, data); - if(model->types[i] == UI_STRING_FREE) { + if(freevalue) { free(data); } break; @@ -752,11 +758,12 @@ } #endif c++; - - char *str = model_getvalue(model, list, elm, row, c); + + freevalue = FALSE; + char *str = model_getvalue(model, list, elm, row, c, &freevalue); g_value_init(&value, G_TYPE_STRING); g_value_set_string(&value, str); - if(model->types[i] == UI_ICON_TEXT_FREE) { + if(model->types[i] == UI_ICON_TEXT_FREE || freevalue) { free(str); } break;