ui/gtk/text.c

changeset 1153
f15375e0480c
parent 1149
76b7664f951e
child 1186
b114038a48da
--- a/ui/gtk/text.c	Fri May 29 22:43:47 2026 +0200
+++ b/ui/gtk/text.c	Sat May 30 20:35:32 2026 +0200
@@ -97,23 +97,21 @@
 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),
+                G_CALLBACK(ui_textbuf_change_insert),
                 textarea);
         g_signal_connect(
                 buf,
                 "delete-range",
-                G_CALLBACK(ui_textbuf_changed_delete),
+                G_CALLBACK(ui_textbuf_change_delete),
                 textarea); 
     } else {
         fprintf(stderr, "Error: create_textbuffer: textarea == NULL\n");
@@ -142,7 +140,10 @@
     uitext->last_selection_state = 0;
     uitext->onchange = args->onchange;
     uitext->onchangedata = args->onchangedata;
-    uitext->action = args->action ? strdup(args->action) : NULL;
+    uitext->onchange_action = args->onchange_action ? strdup(args->onchange_action) : NULL;
+    uitext->ontextchanged = args->ontextchanged;
+    uitext->ontextchangeddata = args->ontextchangeddata;
+    uitext->ontextchanged_action = args->ontextchanged_action ? strdup(args->ontextchanged_action) : NULL;
     
     g_object_set_data(G_OBJECT(text_area), "ui_textarea", uitext);
     g_object_set_data(G_OBJECT(text_area), "ui_textarea_widget", text_area);
@@ -226,7 +227,8 @@
     if(textarea->var) {
         ui_destroy_boundvar(textarea->ctx, textarea->var);
     }
-    free(textarea->action);
+    free(textarea->onchange_action);
+    free(textarea->ontextchanged_action);
     free(textarea);
 }
 
@@ -463,47 +465,11 @@
 }
 
 
-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_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) {
+static void textbuf_change_event(UiTextArea *textarea, UiTextChangeEventData *data) {
     if(!ui_onchange_events_is_enabled()) {
         return;
     }
     
-    UiText *value = textarea->var->value;
-    
     UiEvent e;
     e.obj = textarea->obj;
     e.window = e.obj->window;
@@ -517,13 +483,70 @@
         textarea->onchange(&e, textarea->onchangedata);
     }
     
+    if(textarea->onchange_action) {
+        uic_action_callback(&e, textarea->onchange_action);
+    }
+}
+
+void ui_textbuf_change_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;
+    textbuf_change_event(textarea, &event);
+}
+
+void ui_textbuf_change_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;
+    textbuf_change_event(textarea, &event);
+}
+
+
+void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea) {
+    if(!ui_onchange_events_is_enabled()) {
+        return;
+    }
+    
+    UiText *value = textarea->var->value;
+    
+    UiEvent e;
+    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.intval = 0;
+    e.set = ui_get_setop();
+    
+    if(textarea->ontextchanged) {
+        textarea->ontextchanged(&e, textarea->ontextchangeddata);
+    }
+    
+    if(textarea->ontextchanged_action) {
+        uic_action_callback(&e, textarea->ontextchanged_action);
+    }
+    
     if(value->observers) {
         ui_notify_evt(value->observers, &e);
     }
-    
-    if(textarea->action) {
-        uic_action_callback(&e, textarea->action);
-    }
 }
 
 // undo manager functions

mercurial