implement actions for textfield events (GTK)

Thu, 23 Apr 2026 12:56:13 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 23 Apr 2026 12:56:13 +0200
changeset 1103
4ba6f75d8966
parent 1102
c4883a63929b
child 1104
2cbfa74acda7

implement actions for textfield events (GTK)

ui/gtk/text.c file | annotate | diff | comparison | revisions
ui/gtk/text.h file | annotate | diff | comparison | revisions
--- a/ui/gtk/text.c	Wed Apr 22 19:29:26 2026 +0200
+++ b/ui/gtk/text.c	Thu Apr 23 12:56:13 2026 +0200
@@ -129,6 +129,7 @@
     uitext->last_selection_state = 0;
     uitext->onchange = args->onchange;
     uitext->onchangedata = args->onchangedata;
+    uitext->action = args->action ? strdup(args->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);
@@ -212,6 +213,7 @@
     if(textarea->var) {
         ui_destroy_boundvar(textarea->ctx, textarea->var);
     }
+    free(textarea->action);
     free(textarea);
 }
 
@@ -394,6 +396,10 @@
     if(value->observers) {
         ui_notify_evt(value->observers, &e);
     }
+    
+    if(textarea->action) {
+        uic_action_callback(&e, textarea->action);
+    }
 }
 
 // undo manager functions
@@ -660,6 +666,8 @@
     uitext->onchangedata = args->onchangedata;
     uitext->onactivate = args->onactivate;
     uitext->onactivatedata = args->onactivatedata;
+    uitext->onactivate_action = args->onactivate_action ? strdup(args->onactivate_action) : NULL;
+    uitext->onchange_action = args->onchange_action ? strdup(args->onchange_action) : NULL;
     
     g_signal_connect(
                 textfield,
@@ -703,7 +711,7 @@
         value->obj = GTK_ENTRY(textfield);
     }
     
-    if(args->onchange || var) {
+    if(args->onchange || args->onchange_action || var) {
         g_signal_connect(
                 textfield,
                 "changed",
@@ -711,7 +719,7 @@
                 uitext);
     }
     
-    if(args->onactivate) {
+    if(args->onactivate || args->onactivate_action) {
         g_signal_connect(
                 textfield,
                 "activate",
@@ -771,6 +779,8 @@
 }
 
 void ui_textfield_destroy(GtkWidget *object, UiTextField *textfield) {
+    free(textfield->onactivate_action);
+    free(textfield->onchange_action);
     free(textfield);
 }
 
@@ -786,7 +796,7 @@
     e.window = e.obj->window;
     e.document = textfield->obj->ctx->document;
     e.eventdata = value;
-    e.eventdatatype = value ? UI_EVENT_DATA_TEXT_VALUE : 0;
+    e.eventdatatype = value ? UI_EVENT_DATA_STRING_VALUE : 0;
     e.intval = 0;
     e.set = ui_get_setop();
     
@@ -797,22 +807,31 @@
     if(textfield->var) {
         ui_notify_evt(value->observers, &e);
     }
+    
+    if(textfield->onchange_action) {
+        uic_action_callback(&e, textfield->onchange_action);
+    }
 }
 
 void ui_textfield_activate(GtkEntry* self, UiTextField *textfield) {
-    if(textfield->onactivate) {
-        UiString *value = textfield->var ? textfield->var->value : NULL;
+    UiString *value = textfield->var ? textfield->var->value : NULL;
         
-        UiEvent e;
-        e.obj = textfield->obj;
-        e.window = e.obj->window;
-        e.document = textfield->obj->ctx->document;
-        e.eventdata = value;
-        e.eventdatatype = value ? UI_EVENT_DATA_TEXT_VALUE : 0;
-        e.intval = 0;
-        e.set = ui_get_setop();
+    UiEvent e;
+    e.obj = textfield->obj;
+    e.window = e.obj->window;
+    e.document = textfield->obj->ctx->document;
+    e.eventdata = value;
+    e.eventdatatype = value ? UI_EVENT_DATA_TEXT_VALUE : 0;
+    e.intval = 0;
+    e.set = ui_get_setop();
+    
+    if(textfield->onactivate) {
         textfield->onactivate(&e, textfield->onactivatedata);
     }
+    
+    if(textfield->onactivate_action) {
+        uic_action_callback(&e, textfield->onactivate_action);
+    }
 }
 
 char* ui_textfield_get(UiString *str) {
--- a/ui/gtk/text.h	Wed Apr 22 19:29:26 2026 +0200
+++ b/ui/gtk/text.h	Thu Apr 23 12:56:13 2026 +0200
@@ -67,6 +67,7 @@
     int         last_selection_state;
     ui_callback onchange;
     void        *onchangedata;
+    char        *action;
 } UiTextArea;
 
 typedef struct UiTextField {
@@ -76,6 +77,8 @@
     void        *onchangedata;
     ui_callback onactivate;
     void        *onactivatedata;
+    char        *onactivate_action;
+    char        *onchange_action;
 } UiTextField;
 
 typedef struct UiPathTextField {

mercurial