--- a/ui/gtk/text.c Thu May 28 21:18:33 2026 +0200 +++ b/ui/gtk/text.c Fri May 29 15:40:31 2026 +0200 @@ -97,11 +97,24 @@ 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); + */ + + g_signal_connect( + buf, + "insert-text", + G_CALLBACK(ui_textbuf_changed_insert), + textarea); + g_signal_connect( + buf, + "delete-range", + G_CALLBACK(ui_textbuf_changed_delete), + textarea); } else { fprintf(stderr, "Error: create_textbuffer: textarea == NULL\n"); } @@ -450,8 +463,41 @@ } +void ui_textbuf_changed_insert( + GtkTextBuffer *textbuffer, + GtkTextIter *location, + char *text, + int length, + UiTextArea *textarea) +{ + UiTextChangeEventData event; + event.type = UI_TEXT_INSERT; + event.begin = gtk_text_iter_get_offset(location); + event.end = event.begin + length; + event.text = text; + event.length = length; + ui_textbuf_changed(textarea, &event); +} -void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea) { +void ui_textbuf_changed_delete( + GtkTextBuffer *self, + const GtkTextIter *start, + const GtkTextIter *end, + UiTextArea *textarea) +{ + UiTextChangeEventData event; + event.type = UI_TEXT_DELETE; + event.begin = gtk_text_iter_get_offset(start); + event.end = gtk_text_iter_get_offset(end); + event.text = NULL; + event.length = 0; + ui_textbuf_changed(textarea, &event); +} + + +// void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea) + +void ui_textbuf_changed(UiTextArea *textarea, UiTextChangeEventData *data) { if(!ui_onchange_events_is_enabled()) { return; } @@ -462,8 +508,8 @@ e.obj = textarea->obj; e.window = e.obj->window; e.document = textarea->ctx->document; - e.eventdata = value; - e.eventdatatype = UI_EVENT_DATA_TEXT_VALUE; + e.eventdata = data; + e.eventdatatype = UI_EVENT_DATA_TEXT_CHANGED; e.intval = 0; e.set = ui_get_setop();