--- a/ui/gtk/text.c Mon Mar 24 18:45:32 2025 +0100 +++ b/ui/gtk/text.c Mon Mar 24 18:54:36 2025 +0100 @@ -93,6 +93,20 @@ } #endif +static GtkTextBuffer* create_textbuffer(UiTextArea *textarea) { + GtkTextBuffer *buf = gtk_text_buffer_new(NULL); + if(textarea) { + g_signal_connect( + buf, + "changed", + G_CALLBACK(ui_textbuf_changed), + textarea); + } else { + fprintf(stderr, "Error: create_textbuffer: textarea == NULL\n"); + } + return buf; +} + UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { UiObject* current = uic_current_obj(obj); UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_TEXT); @@ -116,18 +130,14 @@ uitext->onchange = args.onchange; uitext->onchangedata = args.onchangedata; + g_object_set_data(G_OBJECT(text_area), "ui_textarea", uitext); + g_signal_connect( text_area, "destroy", G_CALLBACK(ui_textarea_destroy), uitext); - g_signal_connect( - buf, - "changed", - G_CALLBACK(ui_textbuf_changed), - uitext); - GtkWidget *scroll_area = SCROLLEDWINDOW_NEW(); gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(scroll_area), @@ -155,7 +165,7 @@ if(value->data1 && value->datatype == UI_TEXT_TYPE_BUFFER) { buf = value->data1; } else { - buf = gtk_text_buffer_new(NULL); + buf = create_textbuffer(uitext); if(value->value.ptr) { gtk_text_buffer_set_text(buf, value->value.ptr, -1); value->value.free(value->value.ptr); @@ -207,7 +217,7 @@ void ui_textarea_restore(UiText *text) { GtkWidget *textarea = text->obj; if(!text->data1) { - text->data1 = gtk_text_buffer_new(NULL); + text->data1 = create_textbuffer(g_object_get_data(G_OBJECT(textarea), "ui_textarea")); text->datatype = UI_TEXT_TYPE_BUFFER; } gtk_text_view_set_buffer(GTK_TEXT_VIEW(textarea), text->data1); @@ -798,7 +808,7 @@ evt.document = evt.obj->ctx->document; evt.eventdata = elm->path; evt.intval = event->value0; - e.set = ui_get_setop(); + evt.set = ui_get_setop(); event->callback(&evt, event->userdata); free(path.ptr); }