# HG changeset patch # User Olaf Wintermann # Date 1780062031 -7200 # Node ID 76b7664f951e0e210fa740eed0e1e939d7ce98b5 # Parent 6ebe1b98f53b800934b9b1a21acf5e288ec176de change textarea change events to include UiTextChangeEventData (GTK) diff -r 6ebe1b98f53b -r 76b7664f951e ui/common/wrapper.c --- a/ui/common/wrapper.c Thu May 28 21:18:33 2026 +0200 +++ b/ui/common/wrapper.c Fri May 29 15:40:31 2026 +0200 @@ -28,6 +28,7 @@ #include "wrapper.h" #include "types.h" +#include "ui/text.h" #include #include @@ -296,6 +297,28 @@ free(sel); } +/* -------------------------- UiTextChangedEvent -------------------------- */ + +int ui_text_change_event_get_type(UiTextChangeEventData *event) { + return event->type; +} + +int ui_text_change_event_get_begin(UiTextChangeEventData *event) { + return event->begin; +} + +int ui_text_change_event_get_end(UiTextChangeEventData *event) { + return event->end; +} + +const char* ui_text_change_event_get_text(UiTextChangeEventData *event) { + return event->text; +} + +int ui_text_change_event_get_length(UiTextChangeEventData *event) { + return event->length; +} + /* ---------------------------- UiFileList ---------------------------- */ int ui_filelist_count(UiFileList *flist) { diff -r 6ebe1b98f53b -r 76b7664f951e ui/common/wrapper.h --- a/ui/common/wrapper.h Thu May 28 21:18:33 2026 +0200 +++ b/ui/common/wrapper.h Fri May 29 15:40:31 2026 +0200 @@ -86,6 +86,12 @@ UIEXPORT void ui_list_set_selected_indices(UiList *list, int *indices, int num); UIEXPORT void ui_list_selection_free(UiListSelection *sel); +UIEXPORT int ui_text_change_event_get_type(UiTextChangeEventData *event); +UIEXPORT int ui_text_change_event_get_begin(UiTextChangeEventData *event); +UIEXPORT int ui_text_change_event_get_end(UiTextChangeEventData *event); +UIEXPORT const char* ui_text_change_event_get_text(UiTextChangeEventData *event); +UIEXPORT int ui_text_change_event_get_length(UiTextChangeEventData *event); + UIEXPORT int ui_filelist_count(UiFileList *flist); UIEXPORT char* ui_filelist_get(UiFileList *flist, int index); diff -r 6ebe1b98f53b -r 76b7664f951e ui/gtk/text.c --- 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(); diff -r 6ebe1b98f53b -r 76b7664f951e ui/gtk/text.h --- a/ui/gtk/text.h Thu May 28 21:18:33 2026 +0200 +++ b/ui/gtk/text.h Fri May 29 15:40:31 2026 +0200 @@ -131,7 +131,19 @@ void ui_textarea_remove(UiText *text, int begin, int end); void ui_textarea_realize_event(GtkWidget *widget, gpointer data); -void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea); +//void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea); +void ui_textbuf_changed_insert( + GtkTextBuffer *textbuffer, + GtkTextIter *location, + char *text, + int length, + UiTextArea *textarea); +void ui_textbuf_changed_delete( + GtkTextBuffer *self, + const GtkTextIter *start, + const GtkTextIter *end, + UiTextArea *textarea); +void ui_textbuf_changed(UiTextArea *textarea, UiTextChangeEventData *data); void ui_textbuf_insert( GtkTextBuffer *textbuffer, diff -r 6ebe1b98f53b -r 76b7664f951e ui/ui/text.h --- a/ui/ui/text.h Thu May 28 21:18:33 2026 +0200 +++ b/ui/ui/text.h Fri May 29 15:40:31 2026 +0200 @@ -63,6 +63,19 @@ const int *states; const int *visibility_states; } UiTextAreaArgs; + +typedef enum UiTextChangedEventType { + UI_TEXT_INSERT = 0, + UI_TEXT_DELETE +} UiTextChangedEventType; + +typedef struct UiTextChangeEventData { + UiTextChangedEventType type; + int begin; + int end; + const char *text; + int length; +} UiTextChangeEventData; typedef struct UiTextFieldArgs { UiBool fill; diff -r 6ebe1b98f53b -r 76b7664f951e ui/ui/toolkit.h --- a/ui/ui/toolkit.h Thu May 28 21:18:33 2026 +0200 +++ b/ui/ui/toolkit.h Fri May 29 15:40:31 2026 +0200 @@ -491,6 +491,7 @@ UI_EVENT_DATA_TEXT_VALUE, UI_EVENT_DATA_DOUBLE_VALUE, UI_EVENT_DATA_RANGE_VALUE, + UI_EVENT_DATA_TEXT_CHANGED, UI_EVENT_DATA_LIST_SELECTION, UI_EVENT_DATA_LIST_ELM, UI_EVENT_DATA_DND,