diff -r c4883a63929b -r 4ba6f75d8966 ui/gtk/text.c --- 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) {